import { System } from '../core/System'; import { GameEntity } from '../core/Entity'; import { default as Matter } from 'matter-js'; export interface MatterBodyConfig { /** 物理类型 */ type?: 'dynamic' | 'static' | 'kinematic'; /** 形状 */ shape?: 'circle' | 'rect' | 'polygon'; /** 圆形半径 */ radius?: number; /** 矩形宽度 */ width?: number; /** 矩形高度 */ height?: number; /** 多边形顶点 */ vertices?: { x: number; y: number; }[]; /** 质量 */ mass?: number; /** 密度 */ density?: number; /** 摩擦力 */ friction?: number; /** 空气阻力 */ frictionAir?: number; /** 弹性 */ restitution?: number; /** 是否为传感器(只检测碰撞不响应) */ isSensor?: boolean; /** 碰撞过滤 */ collisionFilter?: { category?: number; mask?: number; group?: number; }; /** 初始角度 */ angle?: number; /** 固定旋转 */ fixedRotation?: boolean; } export interface MatterComponent { /** Matter.js body */ body: Matter.Body; /** 配置 */ config: MatterBodyConfig; } export declare class MatterPhysicsSystem extends System { static priority: number; /** Matter.js 引擎 */ private matterEngine; /** Matter.js 世界 */ private matterWorld; /** Body 到 Entity 的映射 */ private bodyToEntity; /** 重力 */ get gravity(): { x: number; y: number; }; set gravity(value: { x: number; y: number; }); onCreate(): void; onUpdate(dt: number): void; onDestroy(): void; /** * 为实体添加物理 body */ addBody(entity: GameEntity, config: MatterBodyConfig): Matter.Body; /** * 移除实体的物理 body */ removeBody(entity: GameEntity): void; /** * 获取实体的 Matter body */ getBody(entity: GameEntity): Matter.Body | null; /** * 通过 body 获取实体 */ getEntity(body: Matter.Body): GameEntity | null; /** * 施加力 */ applyForce(entity: GameEntity, force: { x: number; y: number; }, point?: { x: number; y: number; }): void; /** * 设置速度 */ setVelocity(entity: GameEntity, velocity: { x: number; y: number; }): void; /** * 设置角速度 */ setAngularVelocity(entity: GameEntity, angularVelocity: number): void; /** * 施加冲量 */ applyImpulse(entity: GameEntity, impulse: { x: number; y: number; }, _point?: { x: number; y: number; }): void; /** * 创建约束(连接两个物体) */ createConstraint(entityA: GameEntity, entityB: GameEntity, options?: { pointA?: { x: number; y: number; }; pointB?: { x: number; y: number; }; length?: number; stiffness?: number; damping?: number; }): Matter.Constraint | null; /** * 移除约束 */ removeConstraint(constraint: Matter.Constraint): void; /** * 点查询(获取某点下的所有物体) */ queryPoint(point: { x: number; y: number; }): GameEntity[]; /** * 区域查询 */ queryRegion(bounds: { min: { x: number; y: number; }; max: { x: number; y: number; }; }): GameEntity[]; /** * 射线查询 */ raycast(start: { x: number; y: number; }, end: { x: number; y: number; }): { entity: GameEntity; point: { x: number; y: number; }; normal: { x: number; y: number; }; }[]; /** * 获取 Matter.js 引擎(高级用法) */ getMatterEngine(): Matter.Engine; /** * 获取 Matter.js 世界(高级用法) */ getMatterWorld(): Matter.World; /** * 检测两个实体是否碰撞(精确碰撞检测) * 支持任意形状组合:circle-circle, circle-rect, circle-polygon, rect-rect, rect-polygon, polygon-polygon */ checkCollision(entityA: GameEntity, entityB: GameEntity): { colliding: boolean; depth: number; normal: { x: number; y: number; }; point: { x: number; y: number; }; } | null; /** * 检测圆形和多边形/矩形/圆形的碰撞 * 用于不使用 Matter body 的实体(手动碰撞检测) */ checkCircleShapeCollision(cx: number, cy: number, radius: number, shape: { type: 'rect' | 'circle' | 'polygon' | 'triangle'; x: number; y: number; width?: number; height?: number; radius?: number; vertices?: { x: number; y: number; }[]; }): { colliding: boolean; depth: number; normal: { x: number; y: number; }; } | null; /** * 检测两个任意形状之间的碰撞 * 支持 rect/circle/polygon/triangle */ checkShapeShapeCollision(shapeA: { type: 'rect' | 'circle' | 'polygon' | 'triangle'; x: number; y: number; width?: number; height?: number; radius?: number; vertices?: { x: number; y: number; }[]; }, shapeB: { type: 'rect' | 'circle' | 'polygon' | 'triangle'; x: number; y: number; width?: number; height?: number; radius?: number; vertices?: { x: number; y: number; }[]; }): { colliding: boolean; depth: number; normal: { x: number; y: number; }; } | null; /** * 创建临时 body 用于碰撞检测(不添加到世界) */ private createTempBody; } //# sourceMappingURL=MatterPhysicsSystem.d.ts.map