Source: scene.js

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;