diff --git a/engine/Polygon.ts b/engine/Polygon.ts index 3a64d96..f22b2b3 100644 --- a/engine/Polygon.ts +++ b/engine/Polygon.ts @@ -1,4 +1,4 @@ -import { createVector, setEdgeNormal, type Vector } from "#/engine/Vector.ts"; +import { createVector, setUnitNormal, type Vector } from "#/engine/Vector.ts"; export type Polygon = { position: Vector; @@ -24,9 +24,9 @@ export function updateAxes({ points, axes }: Polygon): void { for (let i = 0; i < cap; i++) { const pj = points[i + 1]; - setEdgeNormal(axes[i], pi, pj); + setUnitNormal(axes[i], pi, pj); pi = pj; } - setEdgeNormal(axes[cap], pi, p0); + setUnitNormal(axes[cap], pi, p0); } diff --git a/engine/Vector.ts b/engine/Vector.ts index 5fe37d6..36bfb0a 100644 --- a/engine/Vector.ts +++ b/engine/Vector.ts @@ -47,24 +47,22 @@ export function getSquared(vector: Vector): number { return vector.x * vector.x + vector.y * vector.y; } -export function setDistanceNormal(normal: Vector, a: Vector, b: Vector): void { +export function setUnit(unit: Vector, a: Vector, b: Vector): void { const dx = a.x - b.x; const dy = a.y - b.y; - const distance = Math.sqrt(dx * dx + dy * dy); + const inv = 1.0 / Math.sqrt(dx * dx + dy * dy); - if (distance > 0) { - normal.x = dx / distance; - normal.y = dy / distance; - } + unit.x = dx * inv; + unit.y = dy * inv; } -export function setEdgeNormal(normal: Vector, a: Vector, b: Vector): void { - const nx = -(b.y - a.y); +export function setUnitNormal(unit: Vector, a: Vector, b: Vector): void { + const nx = a.y - b.y; const ny = b.x - a.x; const inv = 1.0 / Math.sqrt(nx * nx + ny * ny); - normal.x = nx * inv; - normal.y = ny * inv; + unit.x = nx * inv; + unit.y = ny * inv; } export function getDotProduct(a: Vector, b: Vector): number { @@ -81,13 +79,9 @@ export function scale(vector: Vector, scalar: number): void { } export function normalize(vector: Vector): void { - const magnitude = Math.sqrt(vector.x * vector.x + vector.y * vector.y); - - if (magnitude > 0) { - const scalar = 1 / magnitude; - vector.x *= scalar; - vector.y *= scalar; - } + const inv = 1.0 / Math.sqrt(vector.x * vector.x + vector.y * vector.y); + vector.x *= inv; + vector.y *= inv; } export function isZero(vector: Vector): boolean { diff --git a/engine/dev/GraphBrowser.tsx b/engine/dev/GraphBrowser.tsx index abc011a..8a40bb1 100644 --- a/engine/dev/GraphBrowser.tsx +++ b/engine/dev/GraphBrowser.tsx @@ -12,7 +12,7 @@ import { createVector, getDistance, scale, - setDistanceNormal, + setUnit, type Vector, } from "#/engine/Vector.ts"; @@ -104,7 +104,7 @@ function hookEdge([a, b]: Edge): void { const stiffness = 0.05; const direction = createVector(); - setDistanceNormal(direction, a.position, b.position); + setUnit(direction, a.position, b.position); const distance = getDistance(a.position, b.position); const magnitude = (distance - restLength) * stiffness + Number.EPSILON; diff --git a/engine/system/processPhysics.ts b/engine/system/processPhysics.ts index 2ad4565..5a1b749 100644 --- a/engine/system/processPhysics.ts +++ b/engine/system/processPhysics.ts @@ -1,4 +1,7 @@ import type { Circle } from "#/engine/Circle.ts"; +import type MapProxy from "#/engine/lib/MapProxy.ts"; +import type { Polygon } from "#/engine/Polygon.ts"; +import type { Rect } from "#/engine/Rect.ts"; import $ from "#/engine/Scene.ts"; import type { Vector } from "#/engine/Vector.ts"; @@ -8,26 +11,51 @@ const POLYGON = 2; type Shape = 0 | 1 | 2; -export type Collider = { +export type Collider = { shape: Shape; - body: T; }; -export type Collision = {}; +export type Collision = { + id: string; +}; -export function moveAndCollide( - collider: Collider, +const collisions = new Map(); + +function check( + id: string, + collider: Collider, + position: Vector, + colliders: MapProxy, +): string | undefined { + for (const [oid, other] of colliders.entries()) { + if (oid !== id && other) { + return oid; + } + } +} + +export function moveAndCollide( + id: string, velocity: Vector, delta: number, -): Collision { - return {}; +): Collision | undefined { + return collisions.get(id); } export function processPhysics( ctx: CanvasRenderingContext2D, delta: number, ): void { - for (const [id, collider] of $>("collider")!.entries()) { - const position = $("position")!.get(id); + const colliders = $("collider")!; + const positions = $("position")!; + + for (const [id, collider] of colliders.entries()) { + const position = positions.get(id)!; + const target = check(id, collider.value, position.value, colliders); + if (target !== undefined) { + collisions.set(id, { id: target }); + } else { + collisions.delete(id); + } } } diff --git a/game/entities/hero/entity.ts b/game/entities/hero/entity.ts index 0e8e021..64e8379 100644 --- a/game/entities/hero/entity.ts +++ b/game/entities/hero/entity.ts @@ -29,7 +29,6 @@ const process = defineEntity("hero", { process((id, delta) => { const position = $("position").get(id)!.value; const velocity = $("velocity").get(id)!.value; - const collider = $("collider").get(id)!.value; if (pointer.isDown) { position.x = pointer.position.x; @@ -47,6 +46,6 @@ process((id, delta) => { velocity.x = 0; velocity.y = 0; - const collision = moveAndCollide(collider, velocity, delta); - console.log(collision); + const collision = moveAndCollide(id, velocity, delta); + // console.log(collision); }); diff --git a/game/entities/portal/entity.ts b/game/entities/portal/entity.ts index c811ee9..83f6feb 100644 --- a/game/entities/portal/entity.ts +++ b/game/entities/portal/entity.ts @@ -1,3 +1,4 @@ +import { createCircle } from "#/engine/Circle.ts"; import { defineEntity } from "#/engine/Entity.ts"; import { createSprite, @@ -13,4 +14,5 @@ defineEntity("portal", { position: createVector(), sprite: createSprite(portalSrc), animation: createSpriteAnimation(400, 0), + collider: createCircle(createVector(), 8), });