Каков наилучший подход к использованию createjs.LoadQueue для нескольких классов? - PullRequest
0 голосов
/ 17 марта 2019

Это вопрос о структуре кода / шаблоне.Вот мой код установки:

  • У меня есть класс Game, который загружает все ресурсы (изображения, звуки, шрифты и т. Д.) Для игры, используя объект LoadQueue.

  • У меня есть класс Hero, который наследуется от класса createjs.Sprite.Когда Game создает экземпляр Hero, он передает ему спрайт для использования в качестве параметра.

  • Hero запускает пули.Они созданы из класса Bullet, который наследуется от класса createjs.Bitmap.

Как передать (или иным образом получить) изображение, необходимое классу Bullet?

Показать Я создаю статический / глобальный экземпляр LoadQueue который доступен везде?Должен ли я передать изображение маркера Hero, который, в свою очередь, передает его Bullet?Должен ли я передать экземпляр LoadQueue в поток?Должен ли я использовать отдельные LoadQueue объекты?

Как вы обрабатываете несколько классов (используя модульный подход ES6), требующих ресурсов, загружаемых одним LoadQueue?10

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Это просто вопрос того, как вы хотите создавать вещи.Несколько вариантов:

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 решил эту проблему для анимаций CreateJS, используя глобальный объект images, в который были выгружены предварительно загруженные ресурсы,что было немного грязно, но сработало.В более поздних выпусках они реализовали поиск анимации, в котором есть объект images для легкого доступа.

Cheers,

0 голосов
/ 21 марта 2019

Благодаря указателям от 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 синглтоном, что именно то, что я хотел.Однако это кажется слишком простым.Я что-то упускаю из виду или это разумный подход?

...