Source: ./src/engine/core/resource-manager.js

import ResourceLoaderFactory from "/src/engine/core/resource-loader-factory.js";

/**
 * 리소스를 비동기로 로드하는 역할을 맡는다.
 * 모든 리소스가 불러와졌다면 등록된 콜백 함수를 호출한다.
 */
class ResourceManager {
  /**
   * 불러온 리소스의 개수
   *
   * @property {number}
   * @static
   */
  static loadedResourceCount = 0;
  /**
   * 불러와야할 리소스의 총 개수
   *
   * @property {number}
   * @static
   */
  static totalResourceCount = 0;
  /**
   * 모든 리소스가 불러와졌을 때 실행할 콜백함수
   *
   * @property {function}
   * @static
   */
  static allResourceLoadedCallback = () => {};

  constructor() {}

  /**
   * path를 경로로 하는 리소스를 생성한다.
   * 이 때 리소스는 constructor에 의해 생성된다.
   *
   * @param {string} path - 리소스의 경로
   * @param {Audio.constructor|Image.constructor} constructor - 리소스를 생성할 생성자
   * @param {function} [callback=() => {}] - 리소스가 생성된 이후에 실행할 콜백함수
   * @returns {HTMLAudioElement|HTMLImageElement}
   */
  static loadResource(path, constructor, callback = () => {}) {
    const resourceLoader = ResourceLoaderFactory.create(
      path,
      constructor,
      callback
    );

    return resourceLoader.load();
  }

  /**
   * 로드한 리소스의 개수를 count만큼 증가시킨다.
   *
   * @param {number} count - 로드한 리소스의 개수
   */
  static onResourceLoad(count) {
    ResourceManager.loadedResourceCount += count;

    if (ResourceManager.isAllResourceLoaded()) {
      ResourceManager.allResourceLoadedCallback();
      ResourceManager.removeResourceLoadedCallback();
    }
  }

  /**
   * 모든 리소스가 로드되었는지를 확인한다.
   *
   * @returns {boolean}
   */
  static isAllResourceLoaded() {
    return (
      ResourceManager.loadedResourceCount === ResourceManager.totalResourceCount
    );
  }

  /**
   * 모든 리소스가 로드되었을 때 실행될 콜백함수를 초기화한다.
   */
  static removeResourceLoadedCallback() {
    ResourceManager.allResourceLoadedCallback = () => {};
  }

  /**
   * 로드할 리소스의 총 개수를 증가시킨다.
   *
   * @param {number} count - 로드할 리소스의 개수
   */
  static addResourceCount(count) {
    ResourceManager.totalResourceCount += count;
  }

  /**
   * 모든 리소스가 로드되었을 때 실행할 콜백함수를 설정한다.
   *
   * @param {function} callback
   */
  static setAllResourceLoadedCallback(callback) {
    ResourceManager.allResourceLoadedCallback = callback;
  }

  /**
   * 로드해야할 리소스의 총 개수를 반환한다.
   *
   * @returns {number}
   */
  static getTotalResourceCount() {
    return ResourceManager.totalResourceCount;
  }

  /**
   * 로드한 리소스의 개수를 반환한다.
   *
   * @returns {number}
   */
  static getLoadedResourceCount() {
    return ResourceManager.loadedResourceCount;
  }
}

export default ResourceManager;