废弃core.scene更改为setscene方法
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@esengine/ecs-framework",
|
||||
"version": "2.1.31",
|
||||
"version": "2.1.34",
|
||||
"description": "用于Laya、Cocos Creator等JavaScript游戏引擎的高性能ECS框架",
|
||||
"type": "module",
|
||||
"main": "bin/index.js",
|
||||
|
||||
@@ -205,11 +205,23 @@ export class Core {
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置当前活动的场景
|
||||
* 设置当前场景(已废弃)
|
||||
*
|
||||
* @deprecated 请使用 Core.setScene() 方法代替。scene setter 可能导致场景延迟激活的时序问题,
|
||||
* 而 setScene() 提供更好的类型安全性和可预测的激活时序。
|
||||
*
|
||||
* 迁移示例:
|
||||
* ```typescript
|
||||
* // 旧方式(已废弃)
|
||||
* Core.scene = myScene;
|
||||
*
|
||||
* // 新方式(推荐)
|
||||
* Core.setScene(myScene);
|
||||
* ```
|
||||
*
|
||||
* 如果当前没有场景,会立即切换;否则会在下一帧切换。
|
||||
*
|
||||
* @param value - 要设置的场景实例
|
||||
* @param value - 场景实例
|
||||
*/
|
||||
public static set scene(value: IScene | null) {
|
||||
if (!value) return;
|
||||
@@ -222,10 +234,24 @@ export class Core {
|
||||
}
|
||||
|
||||
/**
|
||||
* 类型安全的场景设置方法
|
||||
* 类型安全的场景设置方法(推荐)
|
||||
*
|
||||
* 这是设置场景的推荐方法,提供更好的类型安全性和可预测的激活时序。
|
||||
* 相比于 scene setter,此方法能确保场景正确初始化和激活。
|
||||
*
|
||||
* 如果当前没有场景,会立即切换;否则会在下一帧切换。
|
||||
*
|
||||
* @param scene - 要设置的场景实例
|
||||
* @returns 设置的场景实例
|
||||
* @returns 设置的场景实例,便于链式调用
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* const myScene = new MyScene();
|
||||
* Core.setScene(myScene);
|
||||
*
|
||||
* // 链式调用
|
||||
* const scene = Core.setScene(new MyScene()).addSystem(new MySystem());
|
||||
* ```
|
||||
*/
|
||||
public static setScene<T extends IScene>(scene: T): T {
|
||||
if (this._instance._scene == null) {
|
||||
@@ -447,6 +473,7 @@ export class Core {
|
||||
private setSceneInternal(scene: IScene): void {
|
||||
this._scene = scene;
|
||||
this.onSceneChanged();
|
||||
this._scene.initialize();
|
||||
this._scene.begin();
|
||||
}
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ export interface IScene {
|
||||
/**
|
||||
* 场景名称
|
||||
*/
|
||||
readonly name: string;
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* 场景中的实体集合
|
||||
@@ -147,10 +147,6 @@ export interface ISceneConfig {
|
||||
* 场景名称
|
||||
*/
|
||||
name?: string;
|
||||
/**
|
||||
* 是否自动开始
|
||||
*/
|
||||
autoStart?: boolean;
|
||||
/**
|
||||
* 调试配置
|
||||
*/
|
||||
|
||||
@@ -14,27 +14,6 @@ import { IScene, ISceneConfig } from './IScene';
|
||||
*
|
||||
* 实现IScene接口,提供场景的基础功能。
|
||||
* 推荐使用组合而非继承的方式来构建自定义场景。
|
||||
*
|
||||
* @example
|
||||
* ```typescript
|
||||
* // 推荐的组合方式
|
||||
* class GameScene implements IScene {
|
||||
* private scene = new Scene();
|
||||
*
|
||||
* public initialize(): void {
|
||||
* this.scene.initialize();
|
||||
* // 自定义初始化逻辑
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* // 仍然支持继承方式
|
||||
* class GameScene extends Scene {
|
||||
* public initialize(): void {
|
||||
* super.initialize();
|
||||
* // 自定义逻辑
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
export class Scene implements IScene {
|
||||
/**
|
||||
@@ -98,10 +77,6 @@ export class Scene implements IScene {
|
||||
return this.entityProcessors.processors;
|
||||
}
|
||||
|
||||
/**
|
||||
* 是否已完成基础初始化
|
||||
*/
|
||||
private _isBaseInitialized = false;
|
||||
|
||||
/**
|
||||
* 创建场景实例
|
||||
@@ -128,16 +103,6 @@ export class Scene implements IScene {
|
||||
this.eventSystem.emitSync('component:added', data);
|
||||
});
|
||||
}
|
||||
|
||||
// 标记基础初始化完成
|
||||
this._isBaseInitialized = true;
|
||||
|
||||
// 立即调用初始化,但确保在基础设施就绪后
|
||||
this.initialize();
|
||||
|
||||
if (config?.autoStart) {
|
||||
this.begin();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -284,27 +249,6 @@ export class Scene implements IScene {
|
||||
return entities;
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量创建实体
|
||||
* @param count 要创建的实体数量
|
||||
* @param namePrefix 实体名称前缀
|
||||
* @returns 创建的实体列表
|
||||
*/
|
||||
public createEntitiesOld(count: number, namePrefix: string = "Entity"): Entity[] {
|
||||
const entities: Entity[] = [];
|
||||
|
||||
// 批量创建实体,延迟缓存清理
|
||||
for (let i = 0; i < count; i++) {
|
||||
const entity = new Entity(`${namePrefix}_${i}`, this.identifierPool.checkOut());
|
||||
entities.push(entity);
|
||||
this.addEntity(entity, true); // 延迟缓存清理
|
||||
}
|
||||
|
||||
// 最后统一清理缓存
|
||||
this.querySystem.clearCache();
|
||||
|
||||
return entities;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从场景中删除所有实体
|
||||
|
||||
@@ -137,6 +137,14 @@ describe('Core - 核心管理系统测试', () => {
|
||||
expect(testScene.beginCalled).toBe(true);
|
||||
});
|
||||
|
||||
test('应该能够使用推荐的setScene方法设置场景', () => {
|
||||
const scene = Core.setScene(testScene);
|
||||
|
||||
expect(Core.scene).toBe(testScene);
|
||||
expect(testScene.beginCalled).toBe(true);
|
||||
expect(scene).toBe(testScene); // 应该返回场景实例
|
||||
});
|
||||
|
||||
test('设置新场景应该触发场景切换', () => {
|
||||
const firstScene = new TestScene();
|
||||
const secondScene = new TestScene();
|
||||
|
||||
@@ -142,6 +142,27 @@ describe('Scene - 场景管理系统测试', () => {
|
||||
expect(scene.entities.count).toBe(0);
|
||||
expect(scene.entityProcessors.count).toBe(0);
|
||||
});
|
||||
|
||||
test('应该能够使用配置创建场景', () => {
|
||||
const configScene = new Scene({ name: "ConfigScene" });
|
||||
expect(configScene.name).toBe("ConfigScene");
|
||||
});
|
||||
|
||||
test('应该能够获取调试信息', () => {
|
||||
scene.name = "DebugScene";
|
||||
scene.createEntity("TestEntity");
|
||||
scene.addEntityProcessor(new MovementSystem());
|
||||
|
||||
const debugInfo = scene.getDebugInfo();
|
||||
|
||||
expect(debugInfo.name).toBe("Scene");
|
||||
expect(debugInfo.entityCount).toBe(1);
|
||||
expect(debugInfo.processorCount).toBe(1);
|
||||
expect(debugInfo.isRunning).toBe(false);
|
||||
expect(debugInfo.entities).toBeDefined();
|
||||
expect(debugInfo.processors).toBeDefined();
|
||||
expect(debugInfo.componentStats).toBeDefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe('实体管理', () => {
|
||||
@@ -446,6 +467,19 @@ describe('Scene - 场景管理系统测试', () => {
|
||||
expect(stats.queryStats.totalQueries).toBeGreaterThan(0);
|
||||
expect(parseFloat(stats.cacheStats.hitRate)).toBeGreaterThanOrEqual(0);
|
||||
});
|
||||
|
||||
test('应该能够压缩组件存储', () => {
|
||||
// 创建一些实体和组件
|
||||
const entities = scene.createEntities(10, "Entity");
|
||||
entities.forEach(entity => {
|
||||
entity.addComponent(new PositionComponent(Math.random() * 100, Math.random() * 100));
|
||||
});
|
||||
|
||||
// 压缩组件存储应该不抛出异常
|
||||
expect(() => {
|
||||
scene.compactComponentStorage();
|
||||
}).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe('内存管理和性能', () => {
|
||||
|
||||
Reference in New Issue
Block a user