From f5fc9224b9ec9b457919fa5a7316b4f58c1f9b7b Mon Sep 17 00:00:00 2001 From: Schluffe Date: Sun, 22 Mar 2026 01:05:57 +0100 Subject: [PATCH] WIP --- engine/system/physics.ts | 42 +++++++++++++++++++++++++++++++++- game/entities/hero/entity.ts | 4 ++-- game/entities/portal/entity.ts | 24 +++++++++++++++---- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/engine/system/physics.ts b/engine/system/physics.ts index f038177..38d5ec8 100644 --- a/engine/system/physics.ts +++ b/engine/system/physics.ts @@ -1,6 +1,6 @@ import type { Circle } from "#/engine/Circle.ts"; import type { Polygon } from "#/engine/Polygon.ts"; -import type { Rect } from "#/engine/Rect.ts"; +import { createRect, type Rect } from "#/engine/Rect.ts"; import $ from "#/engine/Scene.ts"; import { createVector, type Vector } from "#/engine/Vector.ts"; @@ -27,6 +27,7 @@ type Collide = (collision: Collision, cid: string) => void; export type Collider = { shape: Shape; body: Circle | Rect | Polygon; + aabb: Rect; buffer: CollisionBuffer; }; @@ -43,13 +44,45 @@ export function createCollider( body: Circle | Rect | Polygon, bufferSize: number = 8, ): Collider { + let aabb = createRect(createVector(), 0, 0); + switch (shape) { + case CIRCLE: { + const radius = (body as Circle).radius; + const size = radius * 2; + + aabb.width = size; + aabb.height = size; + aabb.position.x = body.position.x - radius; + aabb.position.y = body.position.y - radius; + break; + } + case RECT: { + aabb = body as Rect; + break; + } + case POLYGON: { + break; + } + } + return { shape, body, + aabb, buffer: createCollisionBuffer(bufferSize), }; } +const infAABB = createRect(createVector(), 0, 0); +function sweptAABB(self: Collider, other: Collider, velocity: Vector): void { + infAABB.position.x = other.aabb.position.x - self.aabb.width / 2; + infAABB.position.y = other.aabb.position.y - self.aabb.height / 2; + infAABB.width = other.aabb.width - self.aabb.width; + infAABB.height = other.aabb.height - self.aabb.height; + + // +} + function collideWithCirle(collision: Collision, cid: string) { collision.cid = cid; } @@ -119,7 +152,14 @@ export function moveAndCollide( delta: number, ): Array { const colliders = $("collider")!; + const positions = $("position")!; + const self = colliders.get(id)!.value; + const pos = positions.get(id)!.value; + + self.aabb.position.x = pos.x; + self.aabb.position.y = pos.y; + const slice = self.buffer.slice; slice.length = 0; diff --git a/game/entities/hero/entity.ts b/game/entities/hero/entity.ts index 2d094a2..26980ec 100644 --- a/game/entities/hero/entity.ts +++ b/game/entities/hero/entity.ts @@ -1,7 +1,7 @@ -import { createCircle } from "#/engine/Circle.ts"; import { defineEntity } from "#/engine/Entity.ts"; import { keyboardInput } from "#/engine/Keyboard.ts"; import { pointer } from "#/engine/Pointer.ts"; +import { createRect } from "#/engine/Rect.ts"; import $ from "#/engine/Scene.ts"; import { createSprite, @@ -29,7 +29,7 @@ const process = defineEntity("hero", { sprite: createSprite(idleSrc), animation: createSpriteAnimation(500, 2), velocity: createVector(), - collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), + collider: createCollider(Shape.Rect, createRect(createVector(), 16, 16)), }); process((id, delta) => { diff --git a/game/entities/portal/entity.ts b/game/entities/portal/entity.ts index 2c7b0f0..8fa42fa 100644 --- a/game/entities/portal/entity.ts +++ b/game/entities/portal/entity.ts @@ -1,19 +1,33 @@ -import { createCircle } from "#/engine/Circle.ts"; import { defineEntity } from "#/engine/Entity.ts"; +import { createRect } from "#/engine/Rect.ts"; +import $ from "#/engine/Scene.ts"; import { createSprite, createSpriteAnimation, defineSpriteSheet, } from "#/engine/Sprite.ts"; -import { createCollider, Shape } from "#/engine/system/physics.ts"; -import { createVector } from "#/engine/Vector.ts"; +import { + type Collider, + createCollider, + Shape, +} from "#/engine/system/physics.ts"; +import { createVector, type Vector } from "#/engine/Vector.ts"; import portal from "#/game/assets/portal.png"; const portalSrc = await defineSpriteSheet(portal, 3, 1); -defineEntity("portal", { +const process = defineEntity("portal", { position: createVector(), sprite: createSprite(portalSrc), animation: createSpriteAnimation(400, 0), - collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), + collider: createCollider(Shape.Rect, createRect(createVector(), 16, 16)), +}); + +process((id, delta) => { + const position = $("position").get(id)!.value; + const collider = $("collider").get(id)!.value; + const cPos = collider.aabb.position; + + cPos.x = position.x; + cPos.y = position.y; });