118 lines
3.2 KiB
TypeScript
118 lines
3.2 KiB
TypeScript
/**
|
|
* Physics 2D Runtime Module
|
|
* 2D 物理运行时模块
|
|
*
|
|
* 提供确定性 2D 物理模拟功能
|
|
*/
|
|
|
|
import type { IScene, ServiceContainer } from '@esengine/ecs-framework';
|
|
import { ComponentRegistry } from '@esengine/ecs-framework';
|
|
import type { IRuntimeModuleLoader, SystemContext } from '@esengine/ecs-components';
|
|
import * as RAPIER from '@dimforge/rapier2d-compat';
|
|
|
|
// Components
|
|
import { Rigidbody2DComponent } from './components/Rigidbody2DComponent';
|
|
import { BoxCollider2DComponent } from './components/BoxCollider2DComponent';
|
|
import { CircleCollider2DComponent } from './components/CircleCollider2DComponent';
|
|
import { CapsuleCollider2DComponent } from './components/CapsuleCollider2DComponent';
|
|
import { PolygonCollider2DComponent } from './components/PolygonCollider2DComponent';
|
|
|
|
// Systems
|
|
import { Physics2DSystem } from './systems/Physics2DSystem';
|
|
|
|
// Services
|
|
import { Physics2DService } from './services/Physics2DService';
|
|
|
|
/**
|
|
* Physics 2D Runtime Module
|
|
* 2D 物理运行时模块
|
|
*
|
|
* 实现 IRuntimeModuleLoader 接口,提供:
|
|
* - 物理组件注册
|
|
* - 物理系统创建
|
|
* - Rapier2D 初始化
|
|
*/
|
|
export class PhysicsRuntimeModule implements IRuntimeModuleLoader {
|
|
private _rapierModule: typeof RAPIER | null = null;
|
|
private _physicsSystem: Physics2DSystem | null = null;
|
|
|
|
/**
|
|
* 初始化模块
|
|
* 异步初始化 Rapier2D WASM 模块
|
|
*/
|
|
async onInitialize(): Promise<void> {
|
|
// 初始化 Rapier2D WASM
|
|
await RAPIER.init();
|
|
this._rapierModule = RAPIER;
|
|
}
|
|
|
|
/**
|
|
* 注册组件
|
|
*/
|
|
registerComponents(registry: typeof ComponentRegistry): void {
|
|
registry.register(Rigidbody2DComponent);
|
|
registry.register(BoxCollider2DComponent);
|
|
registry.register(CircleCollider2DComponent);
|
|
registry.register(CapsuleCollider2DComponent);
|
|
registry.register(PolygonCollider2DComponent);
|
|
}
|
|
|
|
/**
|
|
* 注册服务
|
|
*/
|
|
registerServices?(services: ServiceContainer): void {
|
|
// 注册物理服务
|
|
services.registerSingleton(Physics2DService);
|
|
}
|
|
|
|
/**
|
|
* 创建系统
|
|
*/
|
|
createSystems(scene: IScene, context: SystemContext): void {
|
|
// 创建物理系统
|
|
const physicsSystem = new Physics2DSystem({
|
|
physics: context.physicsConfig,
|
|
updateOrder: -1000 // 在其他系统之前运行
|
|
});
|
|
|
|
scene.addSystem(physicsSystem);
|
|
this._physicsSystem = physicsSystem;
|
|
|
|
// 如果 Rapier 已加载,初始化物理系统
|
|
if (this._rapierModule) {
|
|
physicsSystem.initializeWithRapier(this._rapierModule);
|
|
}
|
|
|
|
// 导出到上下文供其他系统使用
|
|
context.physicsSystem = physicsSystem;
|
|
context.physics2DWorld = physicsSystem.world;
|
|
}
|
|
|
|
/**
|
|
* 销毁模块
|
|
*/
|
|
onDestroy(): void {
|
|
this._physicsSystem = null;
|
|
this._rapierModule = null;
|
|
}
|
|
|
|
/**
|
|
* 获取 Rapier 模块
|
|
*/
|
|
getRapierModule(): typeof RAPIER | null {
|
|
return this._rapierModule;
|
|
}
|
|
|
|
/**
|
|
* 获取物理系统
|
|
*/
|
|
getPhysicsSystem(): Physics2DSystem | null {
|
|
return this._physicsSystem;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 默认导出模块实例
|
|
*/
|
|
export default new PhysicsRuntimeModule();
|