シーンの切り替え

ゲームがある程度の規模に達すると、シーンを切り替える必要が出てきます。例えば、イントロやメニューからゲームへの切り替えや、あるレベルから別のレベルへの切り替えです。

ここで最も重要な関数は、現在のシーンを置き換えるengine.loadMainScene()です。これにより、指定した .bin ファイル名やURLをロードします。

以下は、ある時間が経過した後に別のシーンに切り替えるコンポーネントの例です:

import {Component, Property} from '@wonderlandengine/api';

export class LoadAfterDelay extends Component {
    static TypeName = 'load-after-delay';
    static Properties = {
        sceneFile: Property.string("AnotherScene.bin"),
        delaySeconds: Property.float(10),
    };

    start() {
        setTimeout(() => {
            this.engine.loadMainScene({ file: this.sceneFile });
        }, this.delaySeconds*1000);
    }
});

シーンの事前ロード 

シーンが次のシーンをロード中でも引き続き動作しますが、ロードが開始されてから 次のシーンがユーザーに表示されるまでの遅延が発生します。

この遅延を最小限にするには、以下のHTMLタグを<head>index.htmlに記述します:

{/*  不要な場合 <link rel="preload" href="First.bin" ... />  */}
<link rel="preload" href="Next.bin" as="fetch" crossorigin async />
<link rel="preload" href="Last.bin" as="fetch" crossorigin async />

これらのタグはJavaScriptを使用して動的に追加することもできます。

注意点 

シーンをロードしてもイベントリスナーは自動的にクリアされません。これは、DOM要素のイベントリスナーや、エミッターに追加されたコールバックを含みます。イベントリスナーは自分で削除する責任があります。これをコンポーネントのonDeactivateで行うのが最善です。

onDeactivateonDestroyの前に呼ばれます。これらはどちらもシーンがアンロードされたときに呼ばれます。

  keyUpHandler = e => { /* ... */ };

  onActivate() { /* または start() */
    this.engine.canvas.addEventListener('keyup', this.keyUpHandler);
  }

  onDeactivate() {
      /* シーンのリロード時にリスナーを削除しないと、キープレスが
       * 複数回扱われたり、次のシーンでも扱われる可能性があります */
      this.engine.canvas.removeEventListener('keyup', keyUpHandler);
  }