Haxe CreateJS加载外部清单内容失败

3

我正尝试使用Haxe和CreateJS(externs)构建应用程序。

我在加载清单文件方面遇到了问题。

以下是代码:

function loadAssets():void
{
    var _manifest:String = "assets/manifests/mymanifest.json";
    _queue = new LoadQueue(true);
    _queue.on("complete", onQueueComplete);
    _queue.on("error", onQueueError);
    _queue.loadManifest([_manifest]);
}

我的manifest.json文件的内容如下:

{
  "path" : "assets/images/main_menu/",
  "manifest" : 
  [
    {"id" : "mm_background", "src" : "background.jpg", "type":"Image"},
    {"id" : "mm_adv_off", "src" : "advanSelectOff.jpg", "type":"Image"},
    {"id" : "mm_adv_on", "src" : "advanSelectOver.jpg", "type":"Image"},
    {"id" : "mm_tech_off", "src" : "techSelectOff.jpg", "type":"Image"},
    {"id" : "mm_tech_on", "src" : "techSelectOver.jpg", "type":"Image"},
    {"id" : "mm_app_off", "src" : "appSelectOff.jpg", "type":"Image"},
    {"id" : "mm_app_on", "src" : "appSelectOver.jpg", "type":"Image"}
  ]
}

我注意到我的manifest.json被加载了,但是没有任何图像被加载。
onQueueError不触发,所以我认为没有拼写错误或格式错误...
我如何验证: 我在浏览器的控制台中查看并查看网络加载... 控制台没有显示任何错误跟踪等。网络也没有显示任何图像的加载...
1个回答

1
我相信您的清单只是以JSON格式加载,并没有任何标识它为清单的东西。
强制指定清单类型
由于您将清单作为一个带有一个项目的数组添加,因此它会被解释为普通的JSON文件(因为扩展名)。为了将其标记为清单,您可以包含一个类型来告诉PreloadJS该JSON文件是一个清单。
示例:
_queue.loadManifest([
    {src: _manifest, type: "manifest"}
]);

或:直接传递清单文件

将清单作为唯一参数传递,而不是包含清单的数组。如果loadManifest方法接收到一个参数,它会假设它是:

  1. 加载项的数组(这就是您的演示所做的)
  2. 清单对象(基本上是您的JSON内容,但作为JavaScript)
  3. 一个单独的文件路径,它是一个清单。

例如:

_queue.loadManifest(_manifest); // No square brackets

那应该告诉 PreloadJS 加载 JSON,解析它,检查结果的 manifest 属性,并加载它。

感谢Lanny的帮助。 - MikeH
我同意你的看法,我也认为该文件只能作为JSON加载...我尝试了第一种选项(_queue.[oadManifest([{src:_manifest, type:"manifest"}],true));但仍然被视为JSON加载...第二个选项似乎不可行,我收到一个错误,指出loadManifest正在寻找类型为Array<Dynamic>的参数。 - MikeH
你是在使用TypeScript或其他什么吗?loadManifest一直接受的不仅仅是一个数组,所以定义可能是错误的。请注意,以“清单”类型加载仍会将文件作为JSON加载,但是一旦加载文件,它将查找清单属性。你如何确定它只是作为JSON加载的呢? - Lanny
我没有使用TypeScript,但我正在使用Haxe,并且使用了CreateJS的extern。我猜测这个extern的定义可能很少。我在页面上使用createjs2015_11_26_min.js。我认为那应该是最新的。我确定它正在加载文件并将其视为JSON的方式是,一旦文件加载完成,我就能够像访问任何其他JSON一样访问它...我猜它没有看到manifest属性...我对基于Web的应用程序上断点不太熟悉,所以我需要进行一些研究和开发,但我想一旦我掌握了这个技巧,我就能找到问题的根源。 - MikeH
我会发布我的发现。感谢您一直陪伴着我。 - MikeH
好的,经过大量的搜索,我发现了问题所在。我从Haxelib网站上获取的外部库已经过时,并且与createjs网站上的内容不完全匹配。查看Haxelib extern中列出的文件,没有ManifestLoader存在...这就是为什么它默认使用AbstractLoader的原因...不幸的是,我没有时间编写一个新的“最新”extern,所以我想我将不得不编写一些hack代码来解决这个问题...呃...感谢你们的支持。 - MikeH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接