import Phaser from 'phaser';
/**
* @class Базовый класс сцены (надстройка над сценой Фейзера).
* Сцены, используемые в игре, должны наследоваться от этого класса.
*/
class Scene extends Phaser.Scene {
constructor(config) {
super(config);
this.assets = {};
}
/**
* Хук Фейзера, здесь выполняется автоматическая загрузка ресурсов.
* @override
*/
preload() {
// получение ресурсов сцены из поля Game.resources
if (this.game.assets) {
this.assets = this.game.assets[this.scene.key];
}
// загрузка ресурсов
if (this.assets) {
this._loadImages(this.assets.images);
this._loadSpritesheets(this.assets.spritesheets);
this._loadAudio(this.assets.audio);
}
}
/**
* Загружает изображения.
*
* @param {array} imgs Изображения.
*/
_loadImages(imgs) {
this._assetsLoader(imgs, (key, path, params) => {
this.load.image(key, path, params);
});
}
/**
* Загружает спрайты.
*
* @param {array} spritesheets Спрайты.
*/
_loadSpritesheets(spritesheets) {
this._assetsLoader(spritesheets, (key, path, params) => {
this.load.spritesheet(key, path, params);
});
}
/**
* Загружает аудио.
*
* @param {array} audio Аудио-ресурсы.
*/
_loadAudio(audio) {
this._assetsLoader(audio, (key, path) => {
this.load.audio(key, path);
});
}
/**
* Вызывает загрузчик для каждого ресурса.
*
* @param {array} assets Ресурсы.
* @param {function} cb Загрузчик ресурса.
*/
_assetsLoader(assets, cb) {
if (!assets) {
return;
}
for (let asset in assets) {
if (typeof assets[asset].key !== 'string'
|| typeof assets[asset].path !== 'string'
) {
// пропуск ассетов без обязательных полей
continue;
}
let basePath;
if (this.game.config.basePath) {
basePath = this.game.config.basePath;
} else {
basePath = '/';
}
cb(assets[asset].key, basePath + assets[asset].path,
assets[asset].params);
}
}
}
export default Scene;