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

231 lines
7.5 KiB
TypeScript
Raw Normal View History

module es {
/**
*
*/
export class Core extends egret.DisplayObjectContainer {
/**
*
*/
public static emitter: Emitter<CoreEvents>;
/**
* 访
*/
public static graphicsDevice: GraphicsDevice;
/**
*
*/
public static content: ContentManager;
/**
* 访
*/
public static _instance: Core;
public _nextScene: Scene;
public _sceneTransition: SceneTransition;
/**
* 访
*/
public _globalManagers: GlobalManager[] = [];
2020-07-28 16:25:20 +08:00
constructor() {
super();
Core._instance = this;
Core.emitter = new Emitter<CoreEvents>();
Core.content = new ContentManager();
this.addEventListener(egret.Event.ADDED_TO_STAGE, this.onAddToStage, this);
}
/**
* /访
* @constructor
*/
public static get Instance() {
return this._instance;
}
public _scene: Scene;
/**
*
*/
public static get scene() {
2020-07-23 19:28:01 +08:00
if (!this._instance)
return null;
return this._instance._scene;
}
/**
*
* @param value
*/
public static set scene(value: Scene) {
2020-07-28 16:25:20 +08:00
if (!value) {
console.error("场景不能为空");
return;
}
if (this._instance._scene == null) {
this._instance._scene = value;
2020-07-24 16:57:26 +08:00
this._instance.addChild(value);
this._instance._scene.begin();
Core.Instance.onSceneChanged();
} else {
this._instance._nextScene = value;
}
}
2020-07-28 16:25:20 +08:00
/**
* SceneTransition
* @param sceneTransition
*/
public static startSceneTransition<T extends SceneTransition>(sceneTransition: T): T {
if (this._instance._sceneTransition) {
console.warn("在前一个场景完成之前,不能开始一个新的场景转换。");
return;
}
2020-07-28 16:25:20 +08:00
this._instance._sceneTransition = sceneTransition;
return sceneTransition;
}
/**
2020-07-28 16:25:20 +08:00
*
* @param manager
*/
2020-07-28 16:25:20 +08:00
public static registerGlobalManager(manager: es.GlobalManager) {
this._instance._globalManagers.push(manager);
manager.enabled = true;
}
2020-07-28 16:25:20 +08:00
/**
*
* @param manager
*/
public static unregisterGlobalManager(manager: es.GlobalManager) {
this._instance._globalManagers.remove(manager);
manager.enabled = false;
}
2020-07-28 16:25:20 +08:00
/**
* T的全局管理器
* @param type
*/
public static getGlobalManager<T extends es.GlobalManager>(type): T {
for (let i = 0; i < this._instance._globalManagers.length; i++) {
if (this._instance._globalManagers[i] instanceof type)
return this._instance._globalManagers[i] as T;
}
2020-07-28 16:25:20 +08:00
return null;
}
2020-07-28 16:25:20 +08:00
public onOrientationChanged() {
Core.emitter.emit(CoreEvents.OrientationChanged);
}
public async draw() {
2020-07-28 16:25:20 +08:00
if (this._sceneTransition) {
this._sceneTransition.preRender();
// 如果我们有场景转换的特殊处理。我们要么渲染场景过渡,要么渲染场景
2020-07-28 16:25:20 +08:00
if (this._scene && !this._sceneTransition.hasPreviousSceneRender) {
this._scene.render();
this._scene.postRender();
await this._sceneTransition.onBeginTransition();
} else if (this._sceneTransition) {
if (this._scene && this._sceneTransition.isNewSceneLoaded) {
this._scene.render();
this._scene.postRender();
}
this._sceneTransition.render();
}
} else if (this._scene) {
this._scene.render();
Debug.render();
// 如果我们没有一个活跃的场景转换,就像平常一样渲染
this._scene.postRender();
}
}
2020-07-28 16:25:20 +08:00
public startDebugUpdate() {
TimeRuler.Instance.startFrame();
TimeRuler.Instance.beginMark("update", 0x00FF00);
}
2020-07-28 16:25:20 +08:00
public endDebugUpdate() {
TimeRuler.Instance.endMark("update");
}
/**
*
*/
2020-07-28 16:25:20 +08:00
public onSceneChanged() {
Core.emitter.emit(CoreEvents.SceneChanged);
Time.sceneChanged();
}
/**
2020-07-28 16:25:20 +08:00
*
*/
2020-07-28 16:25:20 +08:00
protected onGraphicsDeviceReset() {
Core.emitter.emit(CoreEvents.GraphicsDeviceReset);
}
2020-07-28 16:25:20 +08:00
protected initialize() {
}
2020-07-28 16:25:20 +08:00
protected async update() {
// this.startDebugUpdate();
2020-07-28 16:25:20 +08:00
// 更新我们所有的系统管理器
Time.update(egret.getTimer());
if (this._scene) {
for (let i = this._globalManagers.length - 1; i >= 0; i--) {
if (this._globalManagers[i].enabled)
this._globalManagers[i].update();
}
// 仔细阅读:
// 当场景转换发生时,我们不会更新场景
// -除非是不改变场景的场景转换(没有理由不更新)
// -或者它是一个已经切换到新场景的场景转换(新场景需要做它自己的事情)
if (!this._sceneTransition ||
(this._sceneTransition && (!this._sceneTransition.loadsNewScene || this._sceneTransition.isNewSceneLoaded))) {
this._scene.update();
}
if (this._nextScene) {
this.removeChild(this._scene);
this._scene.end();
this._scene = this._nextScene;
this._nextScene = null;
this.onSceneChanged();
this.addChild(this._scene);
await this._scene.begin();
}
}
2020-07-28 16:25:20 +08:00
// this.endDebugUpdate();
await this.draw();
}
private onAddToStage() {
Core.graphicsDevice = new GraphicsDevice();
this.addEventListener(egret.Event.RESIZE, this.onGraphicsDeviceReset, this);
this.addEventListener(egret.StageOrientationEvent.ORIENTATION_CHANGE, this.onOrientationChanged, this);
this.addEventListener(egret.Event.ENTER_FRAME, this.update, this);
Input.initialize();
this.initialize();
}
}
}