切换场景

当你的游戏发展到一定规模时,你会想要开始在不同的场景间切换。这可能是从介绍或菜单切换到游戏中,或者从一个关卡切换到另一个。

这里最重要的函数是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);
    }
});

预加载场景 

虽然当前场景在加载下一个场景时会继续运行,但从加载开始到用户看到下一个场景之间仍会有延迟。

为了减少这种延迟,你可以在index.html<head>中放置以下HTML标签:

<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);
  }