@combos-fun/plugin-matterjs 0.0.41 → 0.0.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-skill.md +83 -8
- package/combos-plugin.json +1 -1
- package/dist/plugin-matterjs.cjs.js +215 -37
- package/dist/plugin-matterjs.cjs.js.map +1 -1
- package/dist/plugin-matterjs.cjs.prod.js +1 -1
- package/dist/plugin-matterjs.d.ts +49 -8
- package/dist/plugin-matterjs.esm.js +214 -37
- package/dist/plugin-matterjs.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-matterjs.cjs.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n}\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n },\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport { PhysicsType, Physics } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\ndeclare interface BodyOptions {\n chamfer?: number; // chamfer (bevel) size\n angle?: number; // rotation angle\n isStatic?: boolean;\n density?: number; // density\n restitution?: number; // restitution (bounciness)\n velocity?: number; // velocity\n speed?: number; // speed\n motion?: number; // motion (kinetic energy)\n mass?: number;\n}\n\nexport interface RectangleParams {\n x: number;\n y: number;\n width: number;\n height: number;\n options: BodyOptions;\n}\n\nexport interface Verctor {\n x: number;\n y: number;\n}\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n }\n public create(component: Physics): Matter.Body {\n let body: Matter.Body = null;\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const halfW =\n (gameObject.transform.size.width * gameObject.transform.scale.x) / 2;\n const halfH =\n (gameObject.transform.size.height * gameObject.transform.scale.y) / 2;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(halfW, halfH));\n switch (bodyParams.type) {\n case PhysicsType.RECTANGLE: {\n const width = gameObject.transform.size.width * gameObject.transform.scale.x;\n const height = gameObject.transform.size.height * gameObject.transform.scale.y;\n body = this.Bodies.rectangle(x, y, width, height, bodyParams.bodyOptions);\n break;\n }\n case PhysicsType.CIRCLE: {\n const radius = bodyParams.radius ?? defaultRadius;\n body = this.Bodies.circle(x, y, radius, bodyParams.bodyOptions);\n break;\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, bodyParams.sides ?? 6);\n const radius = bodyParams.radius ?? defaultRadius;\n body = this.Bodies.polygon(x, y, sides, radius, bodyParams.bodyOptions);\n break;\n }\n }\n return body;\n }\n\n private getCoordinate(gameObject: GameObject): Verctor {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const verts = body.vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Component, Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n component.body = newBody;\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): any {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n return body;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA: Component = (bodyA as PhysicsLinkedBody).component;\n const componentB: Component = (bodyB as PhysicsLinkedBody).component;\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.41\",\n});\n"],"names":["PhysicsType","Component","Matter","Application","Graphics","PhysicsSystem","System","OBSERVER_TYPE","__decorate","decorators"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin-matterjs.cjs.js","sources":["../lib/Physics.ts","../lib/BodiesFactory.ts","../lib/MatterPixiDebugRenderer.ts","../lib/PhysicsEngine.ts","../lib/PhysicsSystem.ts","../lib/__combosPackageMeta.gen.ts"],"sourcesContent":["import { Component } from '@combos-fun/engine';\nimport Matter from 'matter-js';\n\nexport enum PhysicsType {\n RECTANGLE = 'rectangle',\n CIRCLE = 'circle',\n POLYGON = 'polygon',\n TRAPEZOID = 'trapezoid',\n FROM_VERTICES = 'fromVertices',\n CAPSULE = 'capsule',\n COMPOUND = 'compound',\n EDGE = 'edge',\n CHAIN = 'chain',\n}\n\nexport interface PhysicsVertex {\n x: number\n y: number\n}\n\nexport interface PhysicsBodyOptions {\n isStatic?: boolean,\n restitution?: number,\n density?: number,\n [propName: string]: any,\n}\n\n/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */\nexport interface PhysicsPartParams {\n type: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n}\n\nexport interface PhysicsParams {\n type?: PhysicsType\n bodyOptions?: PhysicsBodyOptions\n position?: {\n x?: number\n y?: number\n }\n sides?: number\n radius?: number\n stopRotation?: boolean\n width?: number\n height?: number\n slope?: number\n vertices?: PhysicsVertex[]\n vertexSets?: PhysicsVertex[][]\n length?: number\n from?: PhysicsVertex\n to?: PhysicsVertex\n thickness?: number\n parts?: PhysicsPartParams[]\n}\n\nexport class Physics extends Component<PhysicsParams> {\n static componentName: string = 'Physics';\n public bodyParams: PhysicsParams;\n public body: Matter.Body;\n private PhysicsEngine: Matter.Engine;\n\n init(params: PhysicsParams) {\n this.bodyParams = params;\n }\n\n update() {\n if (this.body && this.gameObject) {\n this.gameObject.transform.anchor.x = 0;\n this.gameObject.transform.anchor.y = 0;\n this.gameObject.transform.position.x = this.body.position.x;\n this.gameObject.transform.position.y = this.body.position.y;\n if (!this.bodyParams.stopRotation) {\n this.gameObject.transform.rotation = this.body.angle;\n }\n }\n }\n onDestroy() {\n Matter.World.remove(this.PhysicsEngine.world, this.body, true);\n }\n}\n","import Matter from 'matter-js';\nimport decomp from 'poly-decomp';\nimport { PhysicsType, Physics, PhysicsParams, PhysicsPartParams } from './Physics';\nimport { GameObject } from '@combos-fun/engine';\n\ntype ShapeParams = PhysicsParams | PhysicsPartParams;\n\ninterface ShapeContext {\n x: number\n y: number\n transformWidth: number\n transformHeight: number\n defaultRadius: number\n}\n\ninterface Vector2 {\n x: number\n y: number\n}\n\nconst DEFAULT_THICKNESS = 4;\nconst MIN_SEGMENT = 0.5;\n\nlet decompRegistered = false;\n\nfunction ensureDecomp() {\n if (decompRegistered) {\n return;\n }\n const lib = (decomp as any)?.quickDecomp ? decomp : (decomp as any)?.default;\n if (lib?.quickDecomp) {\n Matter.Common.setDecomp(lib);\n }\n decompRegistered = true;\n}\n\nexport default class BodiesFactory {\n private Bodies: typeof Matter.Bodies;\n constructor() {\n this.Bodies = Matter.Bodies;\n ensureDecomp();\n }\n\n public create(component: Physics): Matter.Body {\n const { gameObject, bodyParams } = component;\n const coordinate = this.getCoordinate(gameObject);\n const x = bodyParams.position ? bodyParams.position.x : coordinate.x;\n const y = bodyParams.position ? bodyParams.position.y : coordinate.y;\n const transformWidth =\n gameObject.transform.size.width * gameObject.transform.scale.x;\n const transformHeight =\n gameObject.transform.size.height * gameObject.transform.scale.y;\n /** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */\n const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);\n const body = this.createShape(bodyParams, {\n x,\n y,\n transformWidth,\n transformHeight,\n defaultRadius,\n }, false);\n if (!body) {\n throw new Error(\n `[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`,\n );\n }\n return body;\n }\n\n private createShape(\n params: ShapeParams,\n ctx: ShapeContext,\n isPart: boolean,\n ): Matter.Body {\n const options = params.bodyOptions;\n switch (params.type) {\n case PhysicsType.RECTANGLE: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);\n }\n case PhysicsType.CIRCLE: {\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n case PhysicsType.POLYGON: {\n const sides = Math.max(3, params.sides ?? 6);\n const radius = params.radius ?? ctx.defaultRadius;\n return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);\n }\n case PhysicsType.TRAPEZOID: {\n const width = params.width ?? ctx.transformWidth;\n const height = params.height ?? ctx.transformHeight;\n const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);\n return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);\n }\n case PhysicsType.FROM_VERTICES:\n return this.createFromVertices(params, ctx, options);\n case PhysicsType.CAPSULE:\n return this.createCapsule(params, ctx, options);\n case PhysicsType.EDGE:\n return this.createEdge(params, ctx, options);\n case PhysicsType.CHAIN:\n return this.createChain(params, ctx, options);\n case PhysicsType.COMPOUND:\n if (isPart) {\n throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');\n }\n return this.createCompound(params, ctx, options);\n default:\n throw new Error(\n `[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`,\n );\n }\n }\n\n private createFromVertices(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);\n if (!sets.length || sets.some(set => !set || set.length < 3)) {\n throw new Error(\n '[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each',\n );\n }\n ensureDecomp();\n const body = this.Bodies.fromVertices(\n ctx.x,\n ctx.y,\n sets as Matter.Vector[][],\n options,\n true,\n );\n if (!body) {\n throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');\n }\n return body;\n }\n\n private createCapsule(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const radius = Math.max(1, params.radius ?? ctx.defaultRadius);\n const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);\n const shaft = length - radius * 2;\n if (shaft < MIN_SEGMENT) {\n return this.Bodies.circle(ctx.x, ctx.y, radius, options);\n }\n const parts = [\n this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),\n this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),\n this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),\n ];\n return Matter.Body.create({ ...options, parts });\n }\n\n private createEdge(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n if (!params.from || !params.to) {\n throw new Error('[plugin-matterjs] EDGE requires from and to');\n }\n const x1 = ctx.x + params.from.x;\n const y1 = ctx.y + params.from.y;\n const x2 = ctx.x + params.to.x;\n const y2 = ctx.y + params.to.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n throw new Error('[plugin-matterjs] EDGE from/to are too close');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const { angle: _ignored, ...rest } = options ?? {};\n return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {\n ...rest,\n angle: Math.atan2(dy, dx),\n });\n }\n\n private createChain(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const verts = params.vertices;\n if (!verts || verts.length < 2) {\n throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');\n }\n const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);\n const parts: Matter.Body[] = [];\n for (let i = 0; i < verts.length - 1; i++) {\n const a = verts[i];\n const b = verts[i + 1];\n const x1 = ctx.x + a.x;\n const y1 = ctx.y + a.y;\n const x2 = ctx.x + b.x;\n const y2 = ctx.y + b.y;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.hypot(dx, dy);\n if (len < MIN_SEGMENT) {\n continue;\n }\n parts.push(this.Bodies.rectangle(\n (x1 + x2) / 2,\n (y1 + y2) / 2,\n len,\n thickness,\n { angle: Math.atan2(dy, dx) },\n ));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] CHAIN has no usable segments');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n private createCompound(\n params: ShapeParams,\n ctx: ShapeContext,\n options: PhysicsParams['bodyOptions'],\n ): Matter.Body {\n const partParams = (params as PhysicsParams).parts;\n if (!partParams?.length) {\n throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');\n }\n const parts: Matter.Body[] = [];\n for (let i = 0; i < partParams.length; i++) {\n const part = partParams[i];\n const ox = ctx.x + (part.position?.x ?? 0);\n const oy = ctx.y + (part.position?.y ?? 0);\n const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);\n parts.push(...this.asParts(partBody));\n }\n if (!parts.length) {\n throw new Error('[plugin-matterjs] COMPOUND produced no parts');\n }\n return Matter.Body.create({ ...options, parts });\n }\n\n /** Unwrap a compound wrapper so it can be merged into another parent. */\n private asParts(body: Matter.Body): Matter.Body[] {\n if (body.parts && body.parts.length > 1) {\n return body.parts.slice(1);\n }\n return [body];\n }\n\n private getCoordinate(gameObject: GameObject): Vector2 {\n const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;\n const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;\n return {\n x,\n y,\n };\n }\n}\n","import Matter from 'matter-js';\nimport { Application, Graphics } from 'pixi.js';\n\nexport interface MatterPixiDebugOptions {\n engine: Matter.Engine;\n canvas: HTMLCanvasElement;\n width: number;\n height: number;\n resolution?: number;\n}\n\n/** WebGL wireframe overlay for Matter bodies in test mode. */\nexport class MatterPixiDebugRenderer {\n private readonly engine: Matter.Engine;\n private readonly opts: MatterPixiDebugOptions;\n private app: Application | null = null;\n private graphics: Graphics | null = null;\n private readonly onAfterUpdate: () => void;\n\n constructor(opts: MatterPixiDebugOptions) {\n this.opts = opts;\n this.engine = opts.engine;\n this.onAfterUpdate = () => this.redraw();\n }\n\n async init(): Promise<void> {\n const { canvas, width, height, resolution = 1 } = this.opts;\n const app = new Application();\n await app.init({\n canvas,\n width,\n height,\n resolution,\n autoDensity: true,\n antialias: true,\n backgroundAlpha: 0.12,\n preference: 'webgl',\n });\n this.app = app;\n this.graphics = new Graphics();\n app.stage.addChild(this.graphics);\n Matter.Events.on(this.engine, 'afterUpdate', this.onAfterUpdate);\n }\n\n private redraw(): void {\n const g = this.graphics;\n if (!g) {\n return;\n }\n g.clear();\n const bodies = Matter.Composite.allBodies(this.engine.world);\n for (let b = 0; b < bodies.length; b++) {\n const body = bodies[b];\n if (body.render?.visible === false) {\n continue;\n }\n const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];\n for (let p = 0; p < pieces.length; p++) {\n const verts = pieces[p].vertices;\n if (!verts?.length) {\n continue;\n }\n const v0 = verts[0];\n g.moveTo(v0.x, v0.y);\n for (let i = 1; i < verts.length; i++) {\n g.lineTo(verts[i].x, verts[i].y);\n }\n g.closePath();\n g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });\n }\n }\n }\n\n destroy(): void {\n Matter.Events.off(this.engine, 'afterUpdate', this.onAfterUpdate);\n if (this.app) {\n this.app.destroy(true, { children: true, texture: true });\n this.app = null;\n }\n this.graphics = null;\n }\n}\n","import Matter from 'matter-js';\n\nimport BodiesFactory from './BodiesFactory';\nimport { Game } from '@combos-fun/engine';\nimport type { PhysicsSystemParams } from './PhysicsSystem';\nimport type { Physics } from './Physics';\nimport { MatterPixiDebugRenderer } from './MatterPixiDebugRenderer';\n\nexport interface PhysicsLinkedBody extends Matter.Body {\n component: Physics;\n}\n\n/** Collision pairs often report a compound part, not the parent body. */\nfunction resolveLinkedComponent(body: Matter.Body): Physics | undefined {\n let current: Matter.Body | undefined = body;\n while (current) {\n const linked = current as PhysicsLinkedBody;\n if (linked.component) {\n return linked.component;\n }\n if (!current.parent || current.parent === current) {\n break;\n }\n current = current.parent;\n }\n return undefined;\n}\n\nexport default class PhysicsEngine {\n private Engine: typeof Matter.Engine;\n private World: typeof Matter.World;\n private engine: Matter.Engine;\n private bodiesFactory: BodiesFactory;\n private collisionEvents: string[];\n private bodyEvents: string[];\n private options: PhysicsSystemParams;\n private game: Game;\n private Runner: typeof Matter.Runner;\n private Constraint: typeof Matter.Constraint;\n private mouseConstraint: Matter.MouseConstraint;\n private runner: Matter.Runner;\n private debugRenderer: MatterPixiDebugRenderer | null = null;\n public enabled: boolean = false;\n constructor(game: Game, options: PhysicsSystemParams) {\n this.Engine = Matter.Engine;\n this.World = Matter.World;\n this.bodiesFactory = new BodiesFactory();\n this.Runner = Matter.Runner;\n this.Constraint = Matter.Constraint;\n this.game = game;\n\n this.collisionEvents = ['collisionStart', 'collisionActive', 'collisionEnd'];\n this.bodyEvents = ['tick', 'beforeUpdate', 'afterUpdate', 'beforeRender', 'afterRender', 'afterTick'];\n this.options = options;\n this.runner = this.Runner.create({\n delta: 1000 / (this.options.fps || 60),\n frameDeltaSmoothing: (this.options.deltaSampleSize ?? 1) > 1,\n });\n }\n\n public start() {\n this.engine = this.Engine.create();\n const world = this.World.create(this.options.world as Matter.IWorldDefinition);\n this.engine.world = world;\n if (this.options.isTest) {\n const ownCanvas = !this.options.canvas;\n const canvas = this.options.canvas ?? document.createElement('canvas');\n if (ownCanvas && this.options.element) {\n this.options.element.appendChild(canvas);\n }\n const resolution = this.options.resolution || 1;\n this.debugRenderer = new MatterPixiDebugRenderer({\n engine: this.engine,\n canvas,\n width: this.game.canvas.width / resolution,\n height: this.game.canvas.height / resolution,\n resolution,\n });\n void this.debugRenderer.init().catch(err => {\n console.error('[plugin-matterjs] MatterPixiDebugRenderer init failed', err);\n });\n this.Runner.run(this.runner, this.engine);\n }\n this.enabled = true;\n this.initMouse();\n this.initCollisionEvents();\n this.initBodyEvents();\n }\n\n public update(e) {\n if (!this.engine) {\n return;\n }\n if (!this.options.isTest) {\n this.Runner.tick(this.runner, this.engine, e.currentTime);\n }\n }\n\n public stop() {\n this.enabled = false;\n this.runner.enabled = false;\n }\n\n public destroy() {\n this.debugRenderer?.destroy();\n this.debugRenderer = null;\n if (this.engine) {\n Matter.Runner.stop(this.runner);\n Matter.Engine.clear(this.engine);\n }\n }\n\n public awake() {\n this.enabled = true;\n this.runner.enabled = true;\n }\n public add(component) {\n const body = this.createBodies(component);\n this.World.add(this.engine.world, [body]);\n this.linkComponent(component, body);\n }\n\n public change(component: Physics) {\n const newBody = this.createBodies(component);\n this.World.remove(this.engine.world, component.body, true);\n this.World.add(this.engine.world, [newBody]);\n this.linkComponent(component, newBody);\n }\n public remove(component: Physics) {\n this.World.remove(this.engine.world, component.body, true);\n component.body = undefined;\n }\n\n private createBodies(params): PhysicsLinkedBody {\n const body = this.bodiesFactory.create(params) as PhysicsLinkedBody;\n if (!body) {\n throw new Error('[plugin-matterjs] Failed to create Matter body');\n }\n return body;\n }\n\n private linkComponent(component, body: PhysicsLinkedBody) {\n component.body = body;\n component.Body = Matter.Body;\n component.PhysicsEngine = this.engine;\n component.Constraint = this.Constraint;\n component.mouseConstraint = this.mouseConstraint;\n component.World = this.World;\n body.component = component;\n }\n\n private initCollisionEvents() {\n (this.collisionEvents as Array<'collisionStart' | 'collisionActive' | 'collisionEnd'>).forEach(eventName => {\n Matter.Events.on(this.engine, eventName, (event: Matter.IEventCollision<Matter.Engine>) => {\n const pairs = event.pairs ?? [];\n for (let i = 0; i < pairs.length; i++) {\n const pair = pairs[i];\n const { bodyA, bodyB } = pair;\n const componentA = resolveLinkedComponent(bodyA);\n const componentB = resolveLinkedComponent(bodyB);\n if (!componentA || !componentB) {\n continue;\n }\n componentA.emit(eventName, componentB.gameObject, componentA.gameObject);\n componentB.emit(eventName, componentA.gameObject, componentB.gameObject);\n }\n });\n });\n }\n\n private initMouse() {\n if (this.options.mouse && this.options.mouse.open) {\n const mouse = Matter.Mouse.create(this.game.canvas);\n let options = this.options.mouse.constraint ? {\n mouse,\n constraint: this.options.mouse.constraint\n } : {\n mouse\n };\n this.mouseConstraint = Matter.MouseConstraint.create(this.engine, options);\n this.World.add(this.engine.world, this.mouseConstraint);\n }\n }\n\n private initBodyEvents() {\n this.bodyEvents.forEach(eventName => {\n Matter.Events.on(this.engine, eventName, e => {\n const bodies = e.source.world.bodies;\n bodies.forEach(body => {\n const linked = body as PhysicsLinkedBody;\n linked.component?.emit(eventName, body, linked.component.gameObject);\n });\n });\n });\n }\n}\n","import { System, decorators, OBSERVER_TYPE, Transform } from '@combos-fun/engine';\nimport type { ComponentChanged } from \"@combos-fun/engine\";\nimport PhysicsEngine from './PhysicsEngine';\nimport { Physics } from './Physics';\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends Object ? DeepPartial<T[P]> : T[P];\n}\n\nexport interface PhysicsSystemParams {\n resolution?: number\n fps?: number\n isTest?: boolean\n element?: HTMLElement\n canvas?: HTMLCanvasElement\n deltaSampleSize?: number\n mouse?: {\n open: boolean\n constraint?: Matter.Constraint\n }\n world: DeepPartial<Matter.IWorldDefinition>\n}\n\n@decorators.componentObserver({\n Physics: [{ prop: ['bodyParams'], deep: true }],\n Transform: ['_parent'],\n})\nexport default class PhysicsSystem extends System<PhysicsSystemParams> {\n static systemName = 'PhysicsSystem';\n private engine: PhysicsEngine;\n\n /**\n * System init: configure params before the game starts.\n * @param param init params\n */\n init(param?: PhysicsSystemParams) {\n this.engine = new PhysicsEngine(this.game, param);\n this.game.canvas.setAttribute('data-pixel-ratio', (param.resolution || '1') as string);\n }\n /**\n * Called when the System is installed; if the game has not started, it runs when the\n * game starts. Use it for setup work such as initializing data.\n */\n awake() { }\n\n /**\n * Called after the System is installed and all systems' `awake` have run.\n */\n start() {\n this.engine.start();\n }\n /**\n * Called on every game loop; can perform operations and change component properties.\n */\n update(e) {\n const changes = this.componentObserver.clear();\n for (const changed of changes) {\n if (changed) {\n this.componentChanged(changed);\n }\n }\n this.engine.update(e);\n }\n\n componentChanged(changed: ComponentChanged) {\n if (changed.component instanceof Physics) {\n switch (changed.type) {\n case OBSERVER_TYPE.ADD: {\n if (changed.gameObject.transform.parent && !changed.gameObject.getComponent(Physics).body) {\n this.engine.add(changed.component);\n }\n break;\n }\n case OBSERVER_TYPE.CHANGE: {\n this.engine.change(changed.component);\n break;\n }\n case OBSERVER_TYPE.REMOVE: {\n break;\n }\n }\n } else {\n switch (changed.type) {\n case OBSERVER_TYPE.CHANGE: {\n if ((changed.component as Transform).parent) {\n let physics = changed.gameObject.getComponent(Physics);\n if (physics && !physics.body) {\n this.engine.add(physics);\n }\n } else {\n let physics = changed.gameObject.getComponent(Physics);\n physics && this.engine.remove(physics);\n }\n }\n }\n }\n }\n /**\n * Like `update`, but called after every System's and component's `update` has run.\n */\n lateUpdate() { }\n /**\n * Called when the game starts or resumes playing after a pause.\n */\n onResume() {\n if (!this.engine.enabled) {\n this.engine.awake();\n }\n }\n /**\n * Called when the game is paused.\n */\n onPause() {\n this.engine.stop();\n }\n /**\n * Called when the system is destroyed.\n */\n onDestroy() {\n this.engine?.destroy();\n }\n}\n","/** Auto-generated by scripts/build-package.mjs — do not edit. */\n\nimport PhysicsSystem from './PhysicsSystem';\n\nObject.assign(PhysicsSystem, {\n packageName: \"@combos-fun/plugin-matterjs\",\n packageVersion: \"0.0.44\",\n});\n"],"names":["PhysicsType","Component","Matter","decomp","Application","Graphics","PhysicsSystem","System","OBSERVER_TYPE","__decorate","decorators"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("tslib"),t=require("@combos-fun/engine"),s=require("matter-js"),i=require("pixi.js");function n(e){return e&&e.__esModule?e:{default:e}}var o,a=n(s);exports.PhysicsType=void 0,(o=exports.PhysicsType||(exports.PhysicsType={})).RECTANGLE="rectangle",o.CIRCLE="circle",o.POLYGON="polygon";class r extends t.Component{static{this.componentName="Physics"}init(e){this.bodyParams=e}update(){this.body&&this.gameObject&&(this.gameObject.transform.anchor.x=0,this.gameObject.transform.anchor.y=0,this.gameObject.transform.position.x=this.body.position.x,this.gameObject.transform.position.y=this.body.position.y,this.bodyParams.stopRotation||(this.gameObject.transform.rotation=this.body.angle))}onDestroy(){a.default.World.remove(this.PhysicsEngine.world,this.body,!0)}}class h{constructor(){this.Bodies=a.default.Bodies}create(e){let t=null;const{gameObject:s,bodyParams:i}=e,n=this.getCoordinate(s),o=i.position?i.position.x:n.x,a=i.position?i.position.y:n.y,r=s.transform.size.width*s.transform.scale.x/2,h=s.transform.size.height*s.transform.scale.y/2,c=Math.max(1,Math.min(r,h));switch(i.type){case exports.PhysicsType.RECTANGLE:{const e=s.transform.size.width*s.transform.scale.x,n=s.transform.size.height*s.transform.scale.y;t=this.Bodies.rectangle(o,a,e,n,i.bodyOptions);break}case exports.PhysicsType.CIRCLE:{const e=i.radius??c;t=this.Bodies.circle(o,a,e,i.bodyOptions);break}case exports.PhysicsType.POLYGON:{const e=Math.max(3,i.sides??6),s=i.radius??c;t=this.Bodies.polygon(o,a,e,s,i.bodyOptions);break}}return t}getCoordinate(e){return{x:e.transform.position.x+e.transform.anchor.x*e.parent.transform.size.width,y:e.transform.position.y+e.transform.anchor.y*e.parent.transform.size.height}}}class c{constructor(e){this.app=null,this.graphics=null,this.opts=e,this.engine=e.engine,this.onAfterUpdate=()=>this.redraw()}async init(){const{canvas:e,width:t,height:s,resolution:n=1}=this.opts,o=new i.Application;await o.init({canvas:e,width:t,height:s,resolution:n,autoDensity:!0,antialias:!0,backgroundAlpha:.12,preference:"webgl"}),this.app=o,this.graphics=new i.Graphics,o.stage.addChild(this.graphics),a.default.Events.on(this.engine,"afterUpdate",this.onAfterUpdate)}redraw(){const e=this.graphics;if(!e)return;e.clear();const t=a.default.Composite.allBodies(this.engine.world);for(let s=0;s<t.length;s++){const i=t[s];if(!1===i.render?.visible)continue;const n=i.vertices;if(!n?.length)continue;const o=n[0];e.moveTo(o.x,o.y);for(let t=1;t<n.length;t++)e.lineTo(n[t].x,n[t].y);e.closePath(),e.stroke({width:1,color:58998,alpha:.9})}}destroy(){a.default.Events.off(this.engine,"afterUpdate",this.onAfterUpdate),this.app&&(this.app.destroy(!0,{children:!0,texture:!0}),this.app=null),this.graphics=null}}class d{constructor(e,t){this.debugRenderer=null,this.enabled=!1,this.Engine=a.default.Engine,this.World=a.default.World,this.bodiesFactory=new h,this.Runner=a.default.Runner,this.Constraint=a.default.Constraint,this.game=e,this.collisionEvents=["collisionStart","collisionActive","collisionEnd"],this.bodyEvents=["tick","beforeUpdate","afterUpdate","beforeRender","afterRender","afterTick"],this.options=t,this.runner=this.Runner.create({delta:1e3/(this.options.fps||60),frameDeltaSmoothing:(this.options.deltaSampleSize??1)>1})}start(){this.engine=this.Engine.create();const e=this.World.create(this.options.world);if(this.engine.world=e,this.options.isTest){const e=!this.options.canvas,t=this.options.canvas??document.createElement("canvas");e&&this.options.element&&this.options.element.appendChild(t);const s=this.options.resolution||1;this.debugRenderer=new c({engine:this.engine,canvas:t,width:this.game.canvas.width/s,height:this.game.canvas.height/s,resolution:s}),this.debugRenderer.init().catch(e=>{console.error("[plugin-matterjs] MatterPixiDebugRenderer init failed",e)}),this.Runner.run(this.runner,this.engine)}this.enabled=!0,this.initMouse(),this.initCollisionEvents(),this.initBodyEvents()}update(e){this.engine&&(this.options.isTest||this.Runner.tick(this.runner,this.engine,e.currentTime))}stop(){this.enabled=!1,this.runner.enabled=!1}destroy(){this.debugRenderer?.destroy(),this.debugRenderer=null,this.engine&&(a.default.Runner.stop(this.runner),a.default.Engine.clear(this.engine))}awake(){this.enabled=!0,this.runner.enabled=!0}add(e){const t=this.createBodies(e);this.World.add(this.engine.world,[t]),e.body=t,e.Body=a.default.Body,e.PhysicsEngine=this.engine,e.Constraint=this.Constraint,e.mouseConstraint=this.mouseConstraint,e.World=this.World,t.component=e}change(e){const t=this.createBodies(e);this.World.remove(this.engine.world,e.body,!0),this.World.add(this.engine.world,[t]),e.body=t}remove(e){this.World.remove(this.engine.world,e.body,!0),e.body=void 0}createBodies(e){return this.bodiesFactory.create(e)}initCollisionEvents(){this.collisionEvents.forEach(e=>{a.default.Events.on(this.engine,e,t=>{const s=t.pairs??[];for(let t=0;t<s.length;t++){const i=s[t],{bodyA:n,bodyB:o}=i,a=n.component,r=o.component;a.emit(e,r.gameObject,a.gameObject),r.emit(e,a.gameObject,r.gameObject)}})})}initMouse(){if(this.options.mouse&&this.options.mouse.open){const e=a.default.Mouse.create(this.game.canvas);let t=this.options.mouse.constraint?{mouse:e,constraint:this.options.mouse.constraint}:{mouse:e};this.mouseConstraint=a.default.MouseConstraint.create(this.engine,t),this.World.add(this.engine.world,this.mouseConstraint)}}initBodyEvents(){this.bodyEvents.forEach(e=>{a.default.Events.on(this.engine,e,t=>{t.source.world.bodies.forEach(t=>{const s=t;s.component?.emit(e,t,s.component.gameObject)})})})}}let l=class extends t.System{static{this.systemName="PhysicsSystem"}init(e){this.engine=new d(this.game,e),this.game.canvas.setAttribute("data-pixel-ratio",e.resolution||"1")}awake(){}start(){this.engine.start()}update(e){const t=this.componentObserver.clear();for(const e of t)e&&this.componentChanged(e);this.engine.update(e)}componentChanged(e){if(e.component instanceof r)switch(e.type){case t.OBSERVER_TYPE.ADD:e.gameObject.transform.parent&&!e.gameObject.getComponent(r).body&&this.engine.add(e.component);break;case t.OBSERVER_TYPE.CHANGE:this.engine.change(e.component);case t.OBSERVER_TYPE.REMOVE:}else if(e.type===t.OBSERVER_TYPE.CHANGE)if(e.component.parent){let t=e.gameObject.getComponent(r);t&&!t.body&&this.engine.add(t)}else{let t=e.gameObject.getComponent(r);t&&this.engine.remove(t)}}lateUpdate(){}onResume(){this.engine.enabled||this.engine.awake()}onPause(){this.engine.stop()}onDestroy(){this.engine?.destroy()}};l=e.__decorate([t.decorators.componentObserver({Physics:[{prop:["bodyParams"],deep:!0}],Transform:["_parent"]})],l);var p=l;Object.assign(p,{packageName:"@combos-fun/plugin-matterjs",packageVersion:"0.0.41"}),exports.Physics=r,exports.PhysicsSystem=p;
|
|
1
|
+
"use strict";var t=require("tslib"),e=require("@combos-fun/engine"),s=require("matter-js"),i=require("poly-decomp"),n=require("pixi.js");function o(t){return t&&t.__esModule?t:{default:t}}var r,a=o(s),h=o(i);exports.PhysicsType=void 0,(r=exports.PhysicsType||(exports.PhysicsType={})).RECTANGLE="rectangle",r.CIRCLE="circle",r.POLYGON="polygon",r.TRAPEZOID="trapezoid",r.FROM_VERTICES="fromVertices",r.CAPSULE="capsule",r.COMPOUND="compound",r.EDGE="edge",r.CHAIN="chain";class c extends e.Component{static{this.componentName="Physics"}init(t){this.bodyParams=t}update(){this.body&&this.gameObject&&(this.gameObject.transform.anchor.x=0,this.gameObject.transform.anchor.y=0,this.gameObject.transform.position.x=this.body.position.x,this.gameObject.transform.position.y=this.body.position.y,this.bodyParams.stopRotation||(this.gameObject.transform.rotation=this.body.angle))}onDestroy(){a.default.World.remove(this.PhysicsEngine.world,this.body,!0)}}let d=!1;function p(){if(d)return;const t=h.default?.quickDecomp?h.default:h.default?.default;t?.quickDecomp&&a.default.Common.setDecomp(t),d=!0}class l{constructor(){this.Bodies=a.default.Bodies,p()}create(t){const{gameObject:e,bodyParams:s}=t,i=this.getCoordinate(e),n=s.position?s.position.x:i.x,o=s.position?s.position.y:i.y,r=e.transform.size.width*e.transform.scale.x,a=e.transform.size.height*e.transform.scale.y,h=Math.max(1,Math.min(r,a)/2),c=this.createShape(s,{x:n,y:o,transformWidth:r,transformHeight:a,defaultRadius:h},!1);if(!c)throw new Error(`[plugin-matterjs] Failed to create body for type ${String(s.type)}`);return c}createShape(t,e,s){const i=t.bodyOptions;switch(t.type){case exports.PhysicsType.RECTANGLE:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight;return this.Bodies.rectangle(e.x,e.y,s,n,i)}case exports.PhysicsType.CIRCLE:{const s=t.radius??e.defaultRadius;return this.Bodies.circle(e.x,e.y,s,i)}case exports.PhysicsType.POLYGON:{const s=Math.max(3,t.sides??6),n=t.radius??e.defaultRadius;return this.Bodies.polygon(e.x,e.y,s,n,i)}case exports.PhysicsType.TRAPEZOID:{const s=t.width??e.transformWidth,n=t.height??e.transformHeight,o=Math.min(Math.max(t.slope??.5,0),.999);return this.Bodies.trapezoid(e.x,e.y,s,n,o,i)}case exports.PhysicsType.FROM_VERTICES:return this.createFromVertices(t,e,i);case exports.PhysicsType.CAPSULE:return this.createCapsule(t,e,i);case exports.PhysicsType.EDGE:return this.createEdge(t,e,i);case exports.PhysicsType.CHAIN:return this.createChain(t,e,i);case exports.PhysicsType.COMPOUND:if(s)throw new Error("[plugin-matterjs] Nested COMPOUND parts are not supported");return this.createCompound(t,e,i);default:throw new Error(`[plugin-matterjs] Unsupported PhysicsType: ${String(t.type)}`)}}createFromVertices(t,e,s){const i=t.vertexSets??(t.vertices?[t.vertices]:[]);if(!i.length||i.some(t=>!t||t.length<3))throw new Error("[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each");p();const n=this.Bodies.fromVertices(e.x,e.y,i,s,!0);if(!n)throw new Error("[plugin-matterjs] FROM_VERTICES produced an empty body");return n}createCapsule(t,e,s){const i=Math.max(1,t.radius??e.defaultRadius),n=Math.max(2*i,t.length??e.transformWidth)-2*i;if(n<.5)return this.Bodies.circle(e.x,e.y,i,s);const o=[this.Bodies.rectangle(e.x,e.y,n,2*i),this.Bodies.circle(e.x-n/2,e.y,i),this.Bodies.circle(e.x+n/2,e.y,i)];return a.default.Body.create({...s,parts:o})}createEdge(t,e,s){if(!t.from||!t.to)throw new Error("[plugin-matterjs] EDGE requires from and to");const i=e.x+t.from.x,n=e.y+t.from.y,o=e.x+t.to.x,r=e.y+t.to.y,a=o-i,h=r-n,c=Math.hypot(a,h);if(c<.5)throw new Error("[plugin-matterjs] EDGE from/to are too close");const d=Math.max(1,t.thickness??4),{angle:p,...l}=s??{};return this.Bodies.rectangle((i+o)/2,(n+r)/2,c,d,{...l,angle:Math.atan2(h,a)})}createChain(t,e,s){const i=t.vertices;if(!i||i.length<2)throw new Error("[plugin-matterjs] CHAIN requires vertices with at least 2 points");const n=Math.max(1,t.thickness??4),o=[];for(let t=0;t<i.length-1;t++){const s=i[t],r=i[t+1],a=e.x+s.x,h=e.y+s.y,c=e.x+r.x,d=e.y+r.y,p=c-a,l=d-h,u=Math.hypot(p,l);u<.5||o.push(this.Bodies.rectangle((a+c)/2,(h+d)/2,u,n,{angle:Math.atan2(l,p)}))}if(!o.length)throw new Error("[plugin-matterjs] CHAIN has no usable segments");return a.default.Body.create({...s,parts:o})}createCompound(t,e,s){const i=t.parts;if(!i?.length)throw new Error("[plugin-matterjs] COMPOUND requires a non-empty parts array");const n=[];for(let t=0;t<i.length;t++){const s=i[t],o=e.x+(s.position?.x??0),r=e.y+(s.position?.y??0),a=this.createShape(s,{...e,x:o,y:r},!0);n.push(...this.asParts(a))}if(!n.length)throw new Error("[plugin-matterjs] COMPOUND produced no parts");return a.default.Body.create({...s,parts:n})}asParts(t){return t.parts&&t.parts.length>1?t.parts.slice(1):[t]}getCoordinate(t){return{x:t.transform.position.x+t.transform.anchor.x*t.parent.transform.size.width,y:t.transform.position.y+t.transform.anchor.y*t.parent.transform.size.height}}}class u{constructor(t){this.app=null,this.graphics=null,this.opts=t,this.engine=t.engine,this.onAfterUpdate=()=>this.redraw()}async init(){const{canvas:t,width:e,height:s,resolution:i=1}=this.opts,o=new n.Application;await o.init({canvas:t,width:e,height:s,resolution:i,autoDensity:!0,antialias:!0,backgroundAlpha:.12,preference:"webgl"}),this.app=o,this.graphics=new n.Graphics,o.stage.addChild(this.graphics),a.default.Events.on(this.engine,"afterUpdate",this.onAfterUpdate)}redraw(){const t=this.graphics;if(!t)return;t.clear();const e=a.default.Composite.allBodies(this.engine.world);for(let s=0;s<e.length;s++){const i=e[s];if(!1===i.render?.visible)continue;const n=i.parts&&i.parts.length>1?i.parts.slice(1):[i];for(let e=0;e<n.length;e++){const s=n[e].vertices;if(!s?.length)continue;const i=s[0];t.moveTo(i.x,i.y);for(let e=1;e<s.length;e++)t.lineTo(s[e].x,s[e].y);t.closePath(),t.stroke({width:1,color:58998,alpha:.9})}}}destroy(){a.default.Events.off(this.engine,"afterUpdate",this.onAfterUpdate),this.app&&(this.app.destroy(!0,{children:!0,texture:!0}),this.app=null),this.graphics=null}}function m(t){let e=t;for(;e;){const t=e;if(t.component)return t.component;if(!e.parent||e.parent===e)break;e=e.parent}}class g{constructor(t,e){this.debugRenderer=null,this.enabled=!1,this.Engine=a.default.Engine,this.World=a.default.World,this.bodiesFactory=new l,this.Runner=a.default.Runner,this.Constraint=a.default.Constraint,this.game=t,this.collisionEvents=["collisionStart","collisionActive","collisionEnd"],this.bodyEvents=["tick","beforeUpdate","afterUpdate","beforeRender","afterRender","afterTick"],this.options=e,this.runner=this.Runner.create({delta:1e3/(this.options.fps||60),frameDeltaSmoothing:(this.options.deltaSampleSize??1)>1})}start(){this.engine=this.Engine.create();const t=this.World.create(this.options.world);if(this.engine.world=t,this.options.isTest){const t=!this.options.canvas,e=this.options.canvas??document.createElement("canvas");t&&this.options.element&&this.options.element.appendChild(e);const s=this.options.resolution||1;this.debugRenderer=new u({engine:this.engine,canvas:e,width:this.game.canvas.width/s,height:this.game.canvas.height/s,resolution:s}),this.debugRenderer.init().catch(t=>{console.error("[plugin-matterjs] MatterPixiDebugRenderer init failed",t)}),this.Runner.run(this.runner,this.engine)}this.enabled=!0,this.initMouse(),this.initCollisionEvents(),this.initBodyEvents()}update(t){this.engine&&(this.options.isTest||this.Runner.tick(this.runner,this.engine,t.currentTime))}stop(){this.enabled=!1,this.runner.enabled=!1}destroy(){this.debugRenderer?.destroy(),this.debugRenderer=null,this.engine&&(a.default.Runner.stop(this.runner),a.default.Engine.clear(this.engine))}awake(){this.enabled=!0,this.runner.enabled=!0}add(t){const e=this.createBodies(t);this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}change(t){const e=this.createBodies(t);this.World.remove(this.engine.world,t.body,!0),this.World.add(this.engine.world,[e]),this.linkComponent(t,e)}remove(t){this.World.remove(this.engine.world,t.body,!0),t.body=void 0}createBodies(t){const e=this.bodiesFactory.create(t);if(!e)throw new Error("[plugin-matterjs] Failed to create Matter body");return e}linkComponent(t,e){t.body=e,t.Body=a.default.Body,t.PhysicsEngine=this.engine,t.Constraint=this.Constraint,t.mouseConstraint=this.mouseConstraint,t.World=this.World,e.component=t}initCollisionEvents(){this.collisionEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{const s=e.pairs??[];for(let e=0;e<s.length;e++){const i=s[e],{bodyA:n,bodyB:o}=i,r=m(n),a=m(o);r&&a&&(r.emit(t,a.gameObject,r.gameObject),a.emit(t,r.gameObject,a.gameObject))}})})}initMouse(){if(this.options.mouse&&this.options.mouse.open){const t=a.default.Mouse.create(this.game.canvas);let e=this.options.mouse.constraint?{mouse:t,constraint:this.options.mouse.constraint}:{mouse:t};this.mouseConstraint=a.default.MouseConstraint.create(this.engine,e),this.World.add(this.engine.world,this.mouseConstraint)}}initBodyEvents(){this.bodyEvents.forEach(t=>{a.default.Events.on(this.engine,t,e=>{e.source.world.bodies.forEach(e=>{const s=e;s.component?.emit(t,e,s.component.gameObject)})})})}}let y=class extends e.System{static{this.systemName="PhysicsSystem"}init(t){this.engine=new g(this.game,t),this.game.canvas.setAttribute("data-pixel-ratio",t.resolution||"1")}awake(){}start(){this.engine.start()}update(t){const e=this.componentObserver.clear();for(const t of e)t&&this.componentChanged(t);this.engine.update(t)}componentChanged(t){if(t.component instanceof c)switch(t.type){case e.OBSERVER_TYPE.ADD:t.gameObject.transform.parent&&!t.gameObject.getComponent(c).body&&this.engine.add(t.component);break;case e.OBSERVER_TYPE.CHANGE:this.engine.change(t.component);case e.OBSERVER_TYPE.REMOVE:}else if(t.type===e.OBSERVER_TYPE.CHANGE)if(t.component.parent){let e=t.gameObject.getComponent(c);e&&!e.body&&this.engine.add(e)}else{let e=t.gameObject.getComponent(c);e&&this.engine.remove(e)}}lateUpdate(){}onResume(){this.engine.enabled||this.engine.awake()}onPause(){this.engine.stop()}onDestroy(){this.engine?.destroy()}};y=t.__decorate([e.decorators.componentObserver({Physics:[{prop:["bodyParams"],deep:!0}],Transform:["_parent"]})],y);var f=y;Object.assign(f,{packageName:"@combos-fun/plugin-matterjs",packageVersion:"0.0.44"}),exports.Physics=c,exports.PhysicsSystem=f;
|
|
@@ -60,16 +60,47 @@ declare class PhysicsSystem extends System<PhysicsSystemParams> {
|
|
|
60
60
|
declare enum PhysicsType {
|
|
61
61
|
RECTANGLE = "rectangle",
|
|
62
62
|
CIRCLE = "circle",
|
|
63
|
-
POLYGON = "polygon"
|
|
63
|
+
POLYGON = "polygon",
|
|
64
|
+
TRAPEZOID = "trapezoid",
|
|
65
|
+
FROM_VERTICES = "fromVertices",
|
|
66
|
+
CAPSULE = "capsule",
|
|
67
|
+
COMPOUND = "compound",
|
|
68
|
+
EDGE = "edge",
|
|
69
|
+
CHAIN = "chain"
|
|
70
|
+
}
|
|
71
|
+
interface PhysicsVertex {
|
|
72
|
+
x: number;
|
|
73
|
+
y: number;
|
|
74
|
+
}
|
|
75
|
+
interface PhysicsBodyOptions {
|
|
76
|
+
isStatic?: boolean;
|
|
77
|
+
restitution?: number;
|
|
78
|
+
density?: number;
|
|
79
|
+
[propName: string]: any;
|
|
80
|
+
}
|
|
81
|
+
/** One piece of a `COMPOUND` body. Nested `COMPOUND` is not allowed. */
|
|
82
|
+
interface PhysicsPartParams {
|
|
83
|
+
type: PhysicsType;
|
|
84
|
+
bodyOptions?: PhysicsBodyOptions;
|
|
85
|
+
position?: {
|
|
86
|
+
x?: number;
|
|
87
|
+
y?: number;
|
|
88
|
+
};
|
|
89
|
+
sides?: number;
|
|
90
|
+
radius?: number;
|
|
91
|
+
width?: number;
|
|
92
|
+
height?: number;
|
|
93
|
+
slope?: number;
|
|
94
|
+
vertices?: PhysicsVertex[];
|
|
95
|
+
vertexSets?: PhysicsVertex[][];
|
|
96
|
+
length?: number;
|
|
97
|
+
from?: PhysicsVertex;
|
|
98
|
+
to?: PhysicsVertex;
|
|
99
|
+
thickness?: number;
|
|
64
100
|
}
|
|
65
101
|
interface PhysicsParams {
|
|
66
102
|
type?: PhysicsType;
|
|
67
|
-
bodyOptions?:
|
|
68
|
-
isStatic?: boolean;
|
|
69
|
-
restitution?: number;
|
|
70
|
-
density?: number;
|
|
71
|
-
[propName: string]: any;
|
|
72
|
-
};
|
|
103
|
+
bodyOptions?: PhysicsBodyOptions;
|
|
73
104
|
position?: {
|
|
74
105
|
x?: number;
|
|
75
106
|
y?: number;
|
|
@@ -77,6 +108,16 @@ interface PhysicsParams {
|
|
|
77
108
|
sides?: number;
|
|
78
109
|
radius?: number;
|
|
79
110
|
stopRotation?: boolean;
|
|
111
|
+
width?: number;
|
|
112
|
+
height?: number;
|
|
113
|
+
slope?: number;
|
|
114
|
+
vertices?: PhysicsVertex[];
|
|
115
|
+
vertexSets?: PhysicsVertex[][];
|
|
116
|
+
length?: number;
|
|
117
|
+
from?: PhysicsVertex;
|
|
118
|
+
to?: PhysicsVertex;
|
|
119
|
+
thickness?: number;
|
|
120
|
+
parts?: PhysicsPartParams[];
|
|
80
121
|
}
|
|
81
122
|
declare class Physics extends Component<PhysicsParams> {
|
|
82
123
|
static componentName: string;
|
|
@@ -89,4 +130,4 @@ declare class Physics extends Component<PhysicsParams> {
|
|
|
89
130
|
}
|
|
90
131
|
|
|
91
132
|
export { Physics, PhysicsSystem, PhysicsType };
|
|
92
|
-
export type { PhysicsSystemParams };
|
|
133
|
+
export type { PhysicsBodyOptions, PhysicsParams, PhysicsPartParams, PhysicsSystemParams, PhysicsVertex };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from 'tslib';
|
|
2
2
|
import { Component, System, OBSERVER_TYPE, decorators } from '@combos-fun/engine';
|
|
3
3
|
import Matter from 'matter-js';
|
|
4
|
+
import decomp from 'poly-decomp';
|
|
4
5
|
import { Application, Graphics } from 'pixi.js';
|
|
5
6
|
|
|
6
7
|
var PhysicsType;
|
|
@@ -8,6 +9,12 @@ var PhysicsType;
|
|
|
8
9
|
PhysicsType["RECTANGLE"] = "rectangle";
|
|
9
10
|
PhysicsType["CIRCLE"] = "circle";
|
|
10
11
|
PhysicsType["POLYGON"] = "polygon";
|
|
12
|
+
PhysicsType["TRAPEZOID"] = "trapezoid";
|
|
13
|
+
PhysicsType["FROM_VERTICES"] = "fromVertices";
|
|
14
|
+
PhysicsType["CAPSULE"] = "capsule";
|
|
15
|
+
PhysicsType["COMPOUND"] = "compound";
|
|
16
|
+
PhysicsType["EDGE"] = "edge";
|
|
17
|
+
PhysicsType["CHAIN"] = "chain";
|
|
11
18
|
})(PhysicsType || (PhysicsType = {}));
|
|
12
19
|
class Physics extends Component {
|
|
13
20
|
static { this.componentName = 'Physics'; }
|
|
@@ -30,41 +37,184 @@ class Physics extends Component {
|
|
|
30
37
|
}
|
|
31
38
|
}
|
|
32
39
|
|
|
40
|
+
const DEFAULT_THICKNESS = 4;
|
|
41
|
+
const MIN_SEGMENT = 0.5;
|
|
42
|
+
let decompRegistered = false;
|
|
43
|
+
function ensureDecomp() {
|
|
44
|
+
if (decompRegistered) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const lib = decomp?.quickDecomp ? decomp : decomp?.default;
|
|
48
|
+
if (lib?.quickDecomp) {
|
|
49
|
+
Matter.Common.setDecomp(lib);
|
|
50
|
+
}
|
|
51
|
+
decompRegistered = true;
|
|
52
|
+
}
|
|
33
53
|
class BodiesFactory {
|
|
34
54
|
constructor() {
|
|
35
55
|
this.Bodies = Matter.Bodies;
|
|
56
|
+
ensureDecomp();
|
|
36
57
|
}
|
|
37
58
|
create(component) {
|
|
38
|
-
let body = null;
|
|
39
59
|
const { gameObject, bodyParams } = component;
|
|
40
60
|
const coordinate = this.getCoordinate(gameObject);
|
|
41
61
|
const x = bodyParams.position ? bodyParams.position.x : coordinate.x;
|
|
42
62
|
const y = bodyParams.position ? bodyParams.position.y : coordinate.y;
|
|
43
|
-
const
|
|
44
|
-
const
|
|
63
|
+
const transformWidth = gameObject.transform.size.width * gameObject.transform.scale.x;
|
|
64
|
+
const transformHeight = gameObject.transform.size.height * gameObject.transform.scale.y;
|
|
45
65
|
/** Matter.circle approximates with a polygon; NaN/0 radius breaks vertices. */
|
|
46
|
-
const defaultRadius = Math.max(1, Math.min(
|
|
47
|
-
|
|
66
|
+
const defaultRadius = Math.max(1, Math.min(transformWidth, transformHeight) / 2);
|
|
67
|
+
const body = this.createShape(bodyParams, {
|
|
68
|
+
x,
|
|
69
|
+
y,
|
|
70
|
+
transformWidth,
|
|
71
|
+
transformHeight,
|
|
72
|
+
defaultRadius,
|
|
73
|
+
}, false);
|
|
74
|
+
if (!body) {
|
|
75
|
+
throw new Error(`[plugin-matterjs] Failed to create body for type ${String(bodyParams.type)}`);
|
|
76
|
+
}
|
|
77
|
+
return body;
|
|
78
|
+
}
|
|
79
|
+
createShape(params, ctx, isPart) {
|
|
80
|
+
const options = params.bodyOptions;
|
|
81
|
+
switch (params.type) {
|
|
48
82
|
case PhysicsType.RECTANGLE: {
|
|
49
|
-
const width =
|
|
50
|
-
const height =
|
|
51
|
-
|
|
52
|
-
break;
|
|
83
|
+
const width = params.width ?? ctx.transformWidth;
|
|
84
|
+
const height = params.height ?? ctx.transformHeight;
|
|
85
|
+
return this.Bodies.rectangle(ctx.x, ctx.y, width, height, options);
|
|
53
86
|
}
|
|
54
87
|
case PhysicsType.CIRCLE: {
|
|
55
|
-
const radius =
|
|
56
|
-
|
|
57
|
-
break;
|
|
88
|
+
const radius = params.radius ?? ctx.defaultRadius;
|
|
89
|
+
return this.Bodies.circle(ctx.x, ctx.y, radius, options);
|
|
58
90
|
}
|
|
59
91
|
case PhysicsType.POLYGON: {
|
|
60
|
-
const sides = Math.max(3,
|
|
61
|
-
const radius =
|
|
62
|
-
|
|
63
|
-
|
|
92
|
+
const sides = Math.max(3, params.sides ?? 6);
|
|
93
|
+
const radius = params.radius ?? ctx.defaultRadius;
|
|
94
|
+
return this.Bodies.polygon(ctx.x, ctx.y, sides, radius, options);
|
|
95
|
+
}
|
|
96
|
+
case PhysicsType.TRAPEZOID: {
|
|
97
|
+
const width = params.width ?? ctx.transformWidth;
|
|
98
|
+
const height = params.height ?? ctx.transformHeight;
|
|
99
|
+
const slope = Math.min(Math.max(params.slope ?? 0.5, 0), 0.999);
|
|
100
|
+
return this.Bodies.trapezoid(ctx.x, ctx.y, width, height, slope, options);
|
|
64
101
|
}
|
|
102
|
+
case PhysicsType.FROM_VERTICES:
|
|
103
|
+
return this.createFromVertices(params, ctx, options);
|
|
104
|
+
case PhysicsType.CAPSULE:
|
|
105
|
+
return this.createCapsule(params, ctx, options);
|
|
106
|
+
case PhysicsType.EDGE:
|
|
107
|
+
return this.createEdge(params, ctx, options);
|
|
108
|
+
case PhysicsType.CHAIN:
|
|
109
|
+
return this.createChain(params, ctx, options);
|
|
110
|
+
case PhysicsType.COMPOUND:
|
|
111
|
+
if (isPart) {
|
|
112
|
+
throw new Error('[plugin-matterjs] Nested COMPOUND parts are not supported');
|
|
113
|
+
}
|
|
114
|
+
return this.createCompound(params, ctx, options);
|
|
115
|
+
default:
|
|
116
|
+
throw new Error(`[plugin-matterjs] Unsupported PhysicsType: ${String(params.type)}`);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
createFromVertices(params, ctx, options) {
|
|
120
|
+
const sets = params.vertexSets ?? (params.vertices ? [params.vertices] : []);
|
|
121
|
+
if (!sets.length || sets.some(set => !set || set.length < 3)) {
|
|
122
|
+
throw new Error('[plugin-matterjs] FROM_VERTICES requires vertices (or vertexSets) with at least 3 points each');
|
|
123
|
+
}
|
|
124
|
+
ensureDecomp();
|
|
125
|
+
const body = this.Bodies.fromVertices(ctx.x, ctx.y, sets, options, true);
|
|
126
|
+
if (!body) {
|
|
127
|
+
throw new Error('[plugin-matterjs] FROM_VERTICES produced an empty body');
|
|
65
128
|
}
|
|
66
129
|
return body;
|
|
67
130
|
}
|
|
131
|
+
createCapsule(params, ctx, options) {
|
|
132
|
+
const radius = Math.max(1, params.radius ?? ctx.defaultRadius);
|
|
133
|
+
const length = Math.max(radius * 2, params.length ?? ctx.transformWidth);
|
|
134
|
+
const shaft = length - radius * 2;
|
|
135
|
+
if (shaft < MIN_SEGMENT) {
|
|
136
|
+
return this.Bodies.circle(ctx.x, ctx.y, radius, options);
|
|
137
|
+
}
|
|
138
|
+
const parts = [
|
|
139
|
+
this.Bodies.rectangle(ctx.x, ctx.y, shaft, radius * 2),
|
|
140
|
+
this.Bodies.circle(ctx.x - shaft / 2, ctx.y, radius),
|
|
141
|
+
this.Bodies.circle(ctx.x + shaft / 2, ctx.y, radius),
|
|
142
|
+
];
|
|
143
|
+
return Matter.Body.create({ ...options, parts });
|
|
144
|
+
}
|
|
145
|
+
createEdge(params, ctx, options) {
|
|
146
|
+
if (!params.from || !params.to) {
|
|
147
|
+
throw new Error('[plugin-matterjs] EDGE requires from and to');
|
|
148
|
+
}
|
|
149
|
+
const x1 = ctx.x + params.from.x;
|
|
150
|
+
const y1 = ctx.y + params.from.y;
|
|
151
|
+
const x2 = ctx.x + params.to.x;
|
|
152
|
+
const y2 = ctx.y + params.to.y;
|
|
153
|
+
const dx = x2 - x1;
|
|
154
|
+
const dy = y2 - y1;
|
|
155
|
+
const len = Math.hypot(dx, dy);
|
|
156
|
+
if (len < MIN_SEGMENT) {
|
|
157
|
+
throw new Error('[plugin-matterjs] EDGE from/to are too close');
|
|
158
|
+
}
|
|
159
|
+
const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);
|
|
160
|
+
const { angle: _ignored, ...rest } = options ?? {};
|
|
161
|
+
return this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, {
|
|
162
|
+
...rest,
|
|
163
|
+
angle: Math.atan2(dy, dx),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
createChain(params, ctx, options) {
|
|
167
|
+
const verts = params.vertices;
|
|
168
|
+
if (!verts || verts.length < 2) {
|
|
169
|
+
throw new Error('[plugin-matterjs] CHAIN requires vertices with at least 2 points');
|
|
170
|
+
}
|
|
171
|
+
const thickness = Math.max(1, params.thickness ?? DEFAULT_THICKNESS);
|
|
172
|
+
const parts = [];
|
|
173
|
+
for (let i = 0; i < verts.length - 1; i++) {
|
|
174
|
+
const a = verts[i];
|
|
175
|
+
const b = verts[i + 1];
|
|
176
|
+
const x1 = ctx.x + a.x;
|
|
177
|
+
const y1 = ctx.y + a.y;
|
|
178
|
+
const x2 = ctx.x + b.x;
|
|
179
|
+
const y2 = ctx.y + b.y;
|
|
180
|
+
const dx = x2 - x1;
|
|
181
|
+
const dy = y2 - y1;
|
|
182
|
+
const len = Math.hypot(dx, dy);
|
|
183
|
+
if (len < MIN_SEGMENT) {
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
parts.push(this.Bodies.rectangle((x1 + x2) / 2, (y1 + y2) / 2, len, thickness, { angle: Math.atan2(dy, dx) }));
|
|
187
|
+
}
|
|
188
|
+
if (!parts.length) {
|
|
189
|
+
throw new Error('[plugin-matterjs] CHAIN has no usable segments');
|
|
190
|
+
}
|
|
191
|
+
return Matter.Body.create({ ...options, parts });
|
|
192
|
+
}
|
|
193
|
+
createCompound(params, ctx, options) {
|
|
194
|
+
const partParams = params.parts;
|
|
195
|
+
if (!partParams?.length) {
|
|
196
|
+
throw new Error('[plugin-matterjs] COMPOUND requires a non-empty parts array');
|
|
197
|
+
}
|
|
198
|
+
const parts = [];
|
|
199
|
+
for (let i = 0; i < partParams.length; i++) {
|
|
200
|
+
const part = partParams[i];
|
|
201
|
+
const ox = ctx.x + (part.position?.x ?? 0);
|
|
202
|
+
const oy = ctx.y + (part.position?.y ?? 0);
|
|
203
|
+
const partBody = this.createShape(part, { ...ctx, x: ox, y: oy }, true);
|
|
204
|
+
parts.push(...this.asParts(partBody));
|
|
205
|
+
}
|
|
206
|
+
if (!parts.length) {
|
|
207
|
+
throw new Error('[plugin-matterjs] COMPOUND produced no parts');
|
|
208
|
+
}
|
|
209
|
+
return Matter.Body.create({ ...options, parts });
|
|
210
|
+
}
|
|
211
|
+
/** Unwrap a compound wrapper so it can be merged into another parent. */
|
|
212
|
+
asParts(body) {
|
|
213
|
+
if (body.parts && body.parts.length > 1) {
|
|
214
|
+
return body.parts.slice(1);
|
|
215
|
+
}
|
|
216
|
+
return [body];
|
|
217
|
+
}
|
|
68
218
|
getCoordinate(gameObject) {
|
|
69
219
|
const x = gameObject.transform.position.x + gameObject.transform.anchor.x * gameObject.parent.transform.size.width;
|
|
70
220
|
const y = gameObject.transform.position.y + gameObject.transform.anchor.y * gameObject.parent.transform.size.height;
|
|
@@ -114,17 +264,20 @@ class MatterPixiDebugRenderer {
|
|
|
114
264
|
if (body.render?.visible === false) {
|
|
115
265
|
continue;
|
|
116
266
|
}
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
g.
|
|
267
|
+
const pieces = body.parts && body.parts.length > 1 ? body.parts.slice(1) : [body];
|
|
268
|
+
for (let p = 0; p < pieces.length; p++) {
|
|
269
|
+
const verts = pieces[p].vertices;
|
|
270
|
+
if (!verts?.length) {
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
const v0 = verts[0];
|
|
274
|
+
g.moveTo(v0.x, v0.y);
|
|
275
|
+
for (let i = 1; i < verts.length; i++) {
|
|
276
|
+
g.lineTo(verts[i].x, verts[i].y);
|
|
277
|
+
}
|
|
278
|
+
g.closePath();
|
|
279
|
+
g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });
|
|
125
280
|
}
|
|
126
|
-
g.closePath();
|
|
127
|
-
g.stroke({ width: 1, color: 0x00e676, alpha: 0.9 });
|
|
128
281
|
}
|
|
129
282
|
}
|
|
130
283
|
destroy() {
|
|
@@ -137,6 +290,21 @@ class MatterPixiDebugRenderer {
|
|
|
137
290
|
}
|
|
138
291
|
}
|
|
139
292
|
|
|
293
|
+
/** Collision pairs often report a compound part, not the parent body. */
|
|
294
|
+
function resolveLinkedComponent(body) {
|
|
295
|
+
let current = body;
|
|
296
|
+
while (current) {
|
|
297
|
+
const linked = current;
|
|
298
|
+
if (linked.component) {
|
|
299
|
+
return linked.component;
|
|
300
|
+
}
|
|
301
|
+
if (!current.parent || current.parent === current) {
|
|
302
|
+
break;
|
|
303
|
+
}
|
|
304
|
+
current = current.parent;
|
|
305
|
+
}
|
|
306
|
+
return undefined;
|
|
307
|
+
}
|
|
140
308
|
class PhysicsEngine {
|
|
141
309
|
constructor(game, options) {
|
|
142
310
|
this.debugRenderer = null;
|
|
@@ -210,19 +378,13 @@ class PhysicsEngine {
|
|
|
210
378
|
add(component) {
|
|
211
379
|
const body = this.createBodies(component);
|
|
212
380
|
this.World.add(this.engine.world, [body]);
|
|
213
|
-
component
|
|
214
|
-
component.Body = Matter.Body;
|
|
215
|
-
component.PhysicsEngine = this.engine;
|
|
216
|
-
component.Constraint = this.Constraint;
|
|
217
|
-
component.mouseConstraint = this.mouseConstraint;
|
|
218
|
-
component.World = this.World;
|
|
219
|
-
body.component = component;
|
|
381
|
+
this.linkComponent(component, body);
|
|
220
382
|
}
|
|
221
383
|
change(component) {
|
|
222
384
|
const newBody = this.createBodies(component);
|
|
223
385
|
this.World.remove(this.engine.world, component.body, true);
|
|
224
386
|
this.World.add(this.engine.world, [newBody]);
|
|
225
|
-
component
|
|
387
|
+
this.linkComponent(component, newBody);
|
|
226
388
|
}
|
|
227
389
|
remove(component) {
|
|
228
390
|
this.World.remove(this.engine.world, component.body, true);
|
|
@@ -230,8 +392,20 @@ class PhysicsEngine {
|
|
|
230
392
|
}
|
|
231
393
|
createBodies(params) {
|
|
232
394
|
const body = this.bodiesFactory.create(params);
|
|
395
|
+
if (!body) {
|
|
396
|
+
throw new Error('[plugin-matterjs] Failed to create Matter body');
|
|
397
|
+
}
|
|
233
398
|
return body;
|
|
234
399
|
}
|
|
400
|
+
linkComponent(component, body) {
|
|
401
|
+
component.body = body;
|
|
402
|
+
component.Body = Matter.Body;
|
|
403
|
+
component.PhysicsEngine = this.engine;
|
|
404
|
+
component.Constraint = this.Constraint;
|
|
405
|
+
component.mouseConstraint = this.mouseConstraint;
|
|
406
|
+
component.World = this.World;
|
|
407
|
+
body.component = component;
|
|
408
|
+
}
|
|
235
409
|
initCollisionEvents() {
|
|
236
410
|
this.collisionEvents.forEach(eventName => {
|
|
237
411
|
Matter.Events.on(this.engine, eventName, (event) => {
|
|
@@ -239,8 +413,11 @@ class PhysicsEngine {
|
|
|
239
413
|
for (let i = 0; i < pairs.length; i++) {
|
|
240
414
|
const pair = pairs[i];
|
|
241
415
|
const { bodyA, bodyB } = pair;
|
|
242
|
-
const componentA = bodyA
|
|
243
|
-
const componentB = bodyB
|
|
416
|
+
const componentA = resolveLinkedComponent(bodyA);
|
|
417
|
+
const componentB = resolveLinkedComponent(bodyB);
|
|
418
|
+
if (!componentA || !componentB) {
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
244
421
|
componentA.emit(eventName, componentB.gameObject, componentA.gameObject);
|
|
245
422
|
componentB.emit(eventName, componentA.gameObject, componentB.gameObject);
|
|
246
423
|
}
|
|
@@ -377,7 +554,7 @@ var PhysicsSystem$1 = PhysicsSystem;
|
|
|
377
554
|
/** Auto-generated by scripts/build-package.mjs — do not edit. */
|
|
378
555
|
Object.assign(PhysicsSystem$1, {
|
|
379
556
|
packageName: "@combos-fun/plugin-matterjs",
|
|
380
|
-
packageVersion: "0.0.
|
|
557
|
+
packageVersion: "0.0.44",
|
|
381
558
|
});
|
|
382
559
|
|
|
383
560
|
export { Physics, PhysicsSystem$1 as PhysicsSystem, PhysicsType };
|