在多个类之间使用createjs.LoadQueue的最佳方法是什么?

时间:2019-03-17 18:41:41

标签: createjs

这是关于代码结构/模式的问题。这是我的代码设置:

  • 我有一个Game类,它使用LoadQueue对象为游戏加载所有资源(图像,声音,字体等)。

  • 我有一个Hero类,它是从createjs.Sprite类继承的。当Game实例化Hero时,它会将其作为参数传递给精灵。

  • Hero发射子弹。它们是从Bullet类继承的createjs.Bitmap类创建的。

我应该如何传递(或以其他方式检索)Bullet类所需的图像?

显示我创建了LoadQueue的静态/全局实例,该实例随处可见吗?我是否应该将项目符号图像传递给Hero,而后者又将其传递给Bullet?我应该将LoadQueue实例传递给流吗?我应该使用单独的LoadQueue对象吗?

您如何处理需要使用单个LoadQueue加载的资源的多个类(使用ES6的模块方法)?

谢谢!

2 个答案:

答案 0 :(得分:1)

这只是您要如何设计事物的问题。一些选择:

1)传递任一加载的图像。如果您的应用变大,则意味着也要向视图传递一堆图像,这并不理想。

let view = new View({heroImage, bmpImage}); // In the main view
let hero = new HeroSprite(images.heroImage); // Inside the constructor

2)创建对您的队列的单例样式引用

let queue = SingletonClassReference.queue;
let hero = new HeroSprite(queue.getResult("hero"));

3)使用资产管理器。

init() {
    this.assets = new AssetManager();
}
handleComplete(event) {
    // When an asset loads
    this.assets.register(event.item.id, item.item.result); // API TBD
}
// Somewhere
let assets = getReferenceToAssets(); // Either pass it around or make it singleton
let hero = assets.get("hero");

这仅仅是伪代码。

传递引用比较麻烦,并且会非常紧密地耦合您的代码,因此不是理想的选择。制作某种静态资产类或队列实例要模块化得多,但是实现的确取决于您的偏好。我不建议将这些作为最佳实践,而只是建议一些有关如何使用资产的快速想法。

Adob​​e Animate使用一个全局images对象为CreateJS动画解决了此问题,该对象将预加载的资产转储到了该对象上,虽然有点杂乱,但是可以使用。在较新的发行版中,他们实现了动画的查找,其上有一个images对象,以便于访问。

干杯

答案 1 :(得分:0)

感谢Lanny的指导,我最终要做的是创建一个Loader模块,该模块仅导出createjs.LoadQueue的单个实例:

export default new createjs.LoadQueue();

然后,当我想在另一个模块中使用它时,只需像这样导入它即可:

import Loader from "./Loader.js";

export default class Demo {

  loadResources() {
      Loader.addEventListener('complete', this.start.bind(this));
      Loader.loadManifest("manifest.json");
  }

  start() {
    let test = new createjs.Bitmap(Loader.getResult("test"));
  }

}

由于模块仅被评估一次,因此Loader成为了我想要的单例。但是,这似乎太容易了。我是否缺少明显的东西,或者这是一种合理的方法?