这是关于代码结构/模式的问题。这是我的代码设置:
我有一个Game
类,它使用LoadQueue
对象为游戏加载所有资源(图像,声音,字体等)。
我有一个Hero
类,它是从createjs.Sprite
类继承的。当Game
实例化Hero
时,它会将其作为参数传递给精灵。
Hero
发射子弹。它们是从Bullet
类继承的createjs.Bitmap
类创建的。
我应该如何传递(或以其他方式检索)Bullet
类所需的图像?
显示我创建了LoadQueue
的静态/全局实例,该实例随处可见吗?我是否应该将项目符号图像传递给Hero
,而后者又将其传递给Bullet
?我应该将LoadQueue
实例传递给流吗?我应该使用单独的LoadQueue
对象吗?
您如何处理需要使用单个LoadQueue
加载的资源的多个类(使用ES6的模块方法)?
谢谢!
答案 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");
这仅仅是伪代码。
传递引用比较麻烦,并且会非常紧密地耦合您的代码,因此不是理想的选择。制作某种静态资产类或队列实例要模块化得多,但是实现的确取决于您的偏好。我不建议将这些作为最佳实践,而只是建议一些有关如何使用资产的快速想法。
Adobe 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
成为了我想要的单例。但是,这似乎太容易了。我是否缺少明显的东西,或者这是一种合理的方法?