From ad3c55c3610a001e89b9fc23c1b34ea41670a12b Mon Sep 17 00:00:00 2001 From: dragoncoder047 <101021094+dragoncoder047@users.noreply.github.com> Date: Thu, 24 Oct 2024 12:02:27 -0400 Subject: [PATCH 1/2] change area effector to rectangular coordinates also added globalAngle to constantForce --- examples/physicsfactory.js | 2 +- src/components/physics/effectors.ts | 47 +++++++++++++---------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/examples/physicsfactory.js b/examples/physicsfactory.js index b3e4d2cf..c73c7034 100644 --- a/examples/physicsfactory.js +++ b/examples/physicsfactory.js @@ -51,7 +51,7 @@ add([ pos(20, 150), rect(50, 300), area(), - areaEffector({ forceAngle: -90, forceMagnitude: 150 }), + areaEffector({ force: UP.scale(150) }), { draw() { drawPolygon({ diff --git a/src/components/physics/effectors.ts b/src/components/physics/effectors.ts index c532857f..53f2a984 100644 --- a/src/components/physics/effectors.ts +++ b/src/components/physics/effectors.ts @@ -1,6 +1,6 @@ import { Polygon, Vec2, vec2 } from "../../math"; import type { Comp, GameObj } from "../../types"; -import type { PosComp } from "../transform"; +import type { PosComp, RotateComp } from "../transform"; import type { AreaComp } from "./area"; import type { BodyComp } from "./body"; @@ -39,37 +39,30 @@ export function surfaceEffector( export type AreaEffectorCompOpt = { useGlobalAngle?: boolean; - forceAngle: number; - forceMagnitude: number; - forceVariation?: number; + force: Vec2; linearDrag?: number; - // angularDrag?: number; }; export interface AreaEffectorComp extends Comp { useGlobalAngle: boolean; - forceAngle: number; - forceMagnitude: number; - forceVariation: number; - linearDrag?: number; - // angularDrag?: number; + force: Vec2; + linearDrag: number; } export function areaEffector(opts: AreaEffectorCompOpt): AreaEffectorComp { return { id: "areaEffector", require: ["area"], - useGlobalAngle: opts.useGlobalAngle || false, - forceAngle: opts.forceAngle, - forceMagnitude: opts.forceMagnitude, - forceVariation: opts.forceVariation ?? 0, + force: opts.force, linearDrag: opts.linearDrag ?? 0, - // angularDrag: opts.angularDrag ?? 0, + useGlobalAngle: opts.useGlobalAngle ?? true, add(this: GameObj) { - this.onCollideUpdate("body", (obj, col) => { - const dir = Vec2.fromAngle(this.forceAngle); - const force = dir.scale(this.forceMagnitude); - obj.addForce(force); + this.onCollideUpdate("body", obj => { + obj.addForce( + this.useGlobalAngle + ? this.force + : this.force.rotate(this.transform.getRotation()), + ); if (this.linearDrag) { obj.addForce(obj.vel.scale(-this.linearDrag)); } @@ -82,20 +75,16 @@ export type ForceMode = "constant" | "inverseLinear" | "inverseSquared"; export type PointEffectorCompOpt = { forceMagnitude: number; - forceVariation: number; distanceScale?: number; forceMode?: ForceMode; linearDrag?: number; - // angularDrag?: number; }; export interface PointEffectorComp extends Comp { forceMagnitude: number; - forceVariation: number; distanceScale: number; forceMode: ForceMode; linearDrag: number; - // angularDrag: number; } export function pointEffector(opts: PointEffectorCompOpt): PointEffectorComp { @@ -103,7 +92,6 @@ export function pointEffector(opts: PointEffectorCompOpt): PointEffectorComp { id: "pointEffector", require: ["area", "pos"], forceMagnitude: opts.forceMagnitude, - forceVariation: opts.forceVariation ?? 0, distanceScale: opts.distanceScale ?? 1, forceMode: opts.forceMode || "inverseLinear", linearDrag: opts.linearDrag ?? 0, @@ -132,10 +120,12 @@ export function pointEffector(opts: PointEffectorCompOpt): PointEffectorComp { export type ConstantForceCompOpt = { force?: Vec2; + useGlobalAngle?: boolean; }; export interface ConstantForceComp extends Comp { - force?: Vec2; + force: Vec2 | undefined; + useGlobalAngle: boolean; } export function constantForce(opts: ConstantForceCompOpt): ConstantForceComp { @@ -143,9 +133,14 @@ export function constantForce(opts: ConstantForceCompOpt): ConstantForceComp { id: "constantForce", require: ["body"], force: opts.force, + useGlobalAngle: opts.useGlobalAngle ?? true, update(this: GameObj) { if (this.force) { - this.addForce(this.force); + this.addForce( + this.useGlobalAngle + ? this.force + : this.force.rotate(this.transform.getRotation()), + ); } }, }; From 1b7031c5dc74aa98dd9c47c1896e2c1841050392 Mon Sep 17 00:00:00 2001 From: dragoncoder047 <101021094+dragoncoder047@users.noreply.github.com> Date: Thu, 24 Oct 2024 14:10:34 -0400 Subject: [PATCH 2/2] Unused --- src/components/physics/effectors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/physics/effectors.ts b/src/components/physics/effectors.ts index 53f2a984..11aecdba 100644 --- a/src/components/physics/effectors.ts +++ b/src/components/physics/effectors.ts @@ -1,6 +1,6 @@ import { Polygon, Vec2, vec2 } from "../../math"; import type { Comp, GameObj } from "../../types"; -import type { PosComp, RotateComp } from "../transform"; +import type { PosComp } from "../transform"; import type { AreaComp } from "./area"; import type { BodyComp } from "./body";