diff --git a/src/scene/BaseScene.ts b/src/scene/BaseScene.ts new file mode 100644 index 0000000..fca9a38 --- /dev/null +++ b/src/scene/BaseScene.ts @@ -0,0 +1,34 @@ +import { Container, Ticker } from "pixi.js"; +import { SceneType } from "@/enums/SceneType"; +import type { IBaseScene, SceneLifeCycle } from "./types"; + +export abstract class BaseScene implements IBaseScene { + abstract stage: Container; + readonly name: string; + readonly type: SceneType; + + _assetsLoaded: boolean = false; + _layoutDone: boolean = false; + + constructor(name: string, type: SceneType = SceneType.Normal) { + this.name = name; + this.type = type; + } + + // 用于注入场景切换方法 + changeScene(name: string, options?: { isHolderLast?: boolean }): void { + // 由 SceneManager 注入实现 + throw new Error("changeScene not injected by SceneManager"); + } + + // 生命周期方法 - 默认空实现 + async loadBundle(): Promise {} + async unLoadBundle(): Promise {} + layout(): void | Promise {} + onLoad(): void | Promise {} + onUnLoad(): void | Promise {} + update(dt: number, ticker: Ticker): void {} + lateUpdate(dt: number, ticker: Ticker): void {} +} + +export default BaseScene; \ No newline at end of file diff --git a/src/scene/types.ts b/src/scene/types.ts new file mode 100644 index 0000000..01942c8 --- /dev/null +++ b/src/scene/types.ts @@ -0,0 +1,40 @@ +import { Container, Ticker } from "pixi.js"; +import { SceneType } from "@/enums/SceneType"; + +export interface SceneConfig { + name: string; + type: SceneType; + stage: Container; +} + +export interface SceneLifeCycle { + /** 加载资源包 */ + loadBundle?(): Promise; + /** 卸载资源包 */ + unLoadBundle?(): Promise; + /** 创建布局 */ + layout?(): void | Promise; + /** 场景加载完成 */ + onLoad?(): void | Promise; + /** 场景即将卸载 */ + onUnLoad?(): void | Promise; + /** 每帧更新 */ + update?(dt: number, ticker: Ticker): void; + /** 更新后处理 */ + lateUpdate?(dt: number, ticker: Ticker): void; +} + +export interface IBaseScene extends SceneLifeCycle { + /** 场景容器 */ + stage: Container; + /** 场景名称 */ + readonly name: string; + /** 场景类型 */ + readonly type: SceneType; + /** 是否已加载资源 */ + _assetsLoaded: boolean; + /** 是否已布局 */ + _layoutDone: boolean; + /** 改变场景 */ + changeScene(name: string, options?: { isHolderLast?: boolean }): void; +} \ No newline at end of file