Files
esengine/source/src/ECS/SceneManager.ts

104 lines
3.3 KiB
TypeScript
Raw Normal View History

2020-06-08 11:49:45 +08:00
/** 运行时的场景管理。 */
class SceneManager {
private static _scene: Scene;
private static _nextScene: Scene;
public static sceneTransition: SceneTransition;
2020-06-22 15:27:58 +08:00
public static stage: egret.Stage;
2020-06-08 11:49:45 +08:00
constructor(stage: egret.Stage) {
stage.addEventListener(egret.Event.ENTER_FRAME, SceneManager.update, this);
2020-06-22 15:27:58 +08:00
SceneManager.stage = stage;
SceneManager.initialize(stage);
}
public static get scene() {
return this._scene;
}
public static set scene(value: Scene) {
if (!value)
throw new Error("场景不能为空");
if (this._scene == null) {
this._scene = value;
this._scene.begin();
} else {
this._nextScene = value;
}
}
public static initialize(stage: egret.Stage) {
Input.initialize(stage);
2020-06-08 11:49:45 +08:00
}
public static update() {
Time.update(egret.getTimer());
if (SceneManager._scene) {
for (let i = GlobalManager.globalManagers.length - 1; i >= 0; i--) {
if (GlobalManager.globalManagers[i].enabled)
GlobalManager.globalManagers[i].update();
}
if (!SceneManager.sceneTransition ||
(SceneManager.sceneTransition && (!SceneManager.sceneTransition.loadsNewScene || SceneManager.sceneTransition.isNewSceneLoaded))) {
SceneManager._scene.update();
}
2020-06-08 11:49:45 +08:00
if (SceneManager._nextScene) {
SceneManager._scene.end();
for (let i = 0; i < SceneManager._scene.entities.buffer.length; i++) {
let entity = SceneManager._scene.entities.buffer[i];
2020-06-29 15:41:02 +08:00
entity.destroy();
}
SceneManager._scene = SceneManager._nextScene;
SceneManager._nextScene = null;
SceneManager._scene.begin();
}
2020-06-08 11:49:45 +08:00
}
SceneManager.render();
}
public static render() {
2020-06-22 15:27:58 +08:00
if (this.sceneTransition){
this.sceneTransition.preRender();
2020-06-22 15:27:58 +08:00
if (this._scene && !this.sceneTransition.hasPreviousSceneRender){
this._scene.render();
this._scene.postRender();
this.sceneTransition.onBeginTransition();
2020-06-22 15:27:58 +08:00
} else if (this.sceneTransition) {
if (this._scene && this.sceneTransition.isNewSceneLoaded) {
this._scene.render();
this._scene.postRender();
2020-06-22 15:27:58 +08:00
}
this.sceneTransition.render();
}
} else if (this._scene) {
this._scene.render();
2020-07-09 16:16:04 +08:00
Debug.render();
this._scene.postRender();
}
2020-06-08 11:49:45 +08:00
}
2020-06-08 16:23:48 +08:00
/**
* SceneTransition
* @param sceneTransition
*/
public static startSceneTransition<T extends SceneTransition>(sceneTransition: T): T {
2020-06-22 15:27:58 +08:00
if (this.sceneTransition) {
2020-06-23 17:36:39 +08:00
console.warn("在前一个场景完成之前,不能开始一个新的场景转换。");
2020-06-23 16:18:14 +08:00
return;
}
this.sceneTransition = sceneTransition;
return sceneTransition;
2020-06-08 16:23:48 +08:00
}
2020-06-08 11:49:45 +08:00
}