This commit is contained in:
Schluffe
2026-03-22 01:05:57 +01:00
parent fb36881847
commit f5fc9224b9
3 changed files with 62 additions and 8 deletions
+41 -1
View File
@@ -1,6 +1,6 @@
import type { Circle } from "#/engine/Circle.ts"; import type { Circle } from "#/engine/Circle.ts";
import type { Polygon } from "#/engine/Polygon.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 $ from "#/engine/Scene.ts";
import { createVector, type Vector } from "#/engine/Vector.ts"; import { createVector, type Vector } from "#/engine/Vector.ts";
@@ -27,6 +27,7 @@ type Collide = (collision: Collision, cid: string) => void;
export type Collider = { export type Collider = {
shape: Shape; shape: Shape;
body: Circle | Rect | Polygon; body: Circle | Rect | Polygon;
aabb: Rect;
buffer: CollisionBuffer; buffer: CollisionBuffer;
}; };
@@ -43,13 +44,45 @@ export function createCollider(
body: Circle | Rect | Polygon, body: Circle | Rect | Polygon,
bufferSize: number = 8, bufferSize: number = 8,
): Collider { ): 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 { return {
shape, shape,
body, body,
aabb,
buffer: createCollisionBuffer(bufferSize), 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) { function collideWithCirle(collision: Collision, cid: string) {
collision.cid = cid; collision.cid = cid;
} }
@@ -119,7 +152,14 @@ export function moveAndCollide(
delta: number, delta: number,
): Array<Collision> { ): Array<Collision> {
const colliders = $<Collider>("collider")!; const colliders = $<Collider>("collider")!;
const positions = $<Vector>("position")!;
const self = colliders.get(id)!.value; 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; const slice = self.buffer.slice;
slice.length = 0; slice.length = 0;
+2 -2
View File
@@ -1,7 +1,7 @@
import { createCircle } from "#/engine/Circle.ts";
import { defineEntity } from "#/engine/Entity.ts"; import { defineEntity } from "#/engine/Entity.ts";
import { keyboardInput } from "#/engine/Keyboard.ts"; import { keyboardInput } from "#/engine/Keyboard.ts";
import { pointer } from "#/engine/Pointer.ts"; import { pointer } from "#/engine/Pointer.ts";
import { createRect } from "#/engine/Rect.ts";
import $ from "#/engine/Scene.ts"; import $ from "#/engine/Scene.ts";
import { import {
createSprite, createSprite,
@@ -29,7 +29,7 @@ const process = defineEntity("hero", {
sprite: createSprite(idleSrc), sprite: createSprite(idleSrc),
animation: createSpriteAnimation(500, 2), animation: createSpriteAnimation(500, 2),
velocity: createVector(), velocity: createVector(),
collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), collider: createCollider(Shape.Rect, createRect(createVector(), 16, 16)),
}); });
process((id, delta) => { process((id, delta) => {
+19 -5
View File
@@ -1,19 +1,33 @@
import { createCircle } from "#/engine/Circle.ts";
import { defineEntity } from "#/engine/Entity.ts"; import { defineEntity } from "#/engine/Entity.ts";
import { createRect } from "#/engine/Rect.ts";
import $ from "#/engine/Scene.ts";
import { import {
createSprite, createSprite,
createSpriteAnimation, createSpriteAnimation,
defineSpriteSheet, defineSpriteSheet,
} from "#/engine/Sprite.ts"; } from "#/engine/Sprite.ts";
import { createCollider, Shape } from "#/engine/system/physics.ts"; import {
import { createVector } from "#/engine/Vector.ts"; type Collider,
createCollider,
Shape,
} from "#/engine/system/physics.ts";
import { createVector, type Vector } from "#/engine/Vector.ts";
import portal from "#/game/assets/portal.png"; import portal from "#/game/assets/portal.png";
const portalSrc = await defineSpriteSheet(portal, 3, 1); const portalSrc = await defineSpriteSheet(portal, 3, 1);
defineEntity("portal", { const process = defineEntity("portal", {
position: createVector(), position: createVector(),
sprite: createSprite(portalSrc), sprite: createSprite(portalSrc),
animation: createSpriteAnimation(400, 0), animation: createSpriteAnimation(400, 0),
collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), collider: createCollider(Shape.Rect, createRect(createVector(), 16, 16)),
});
process((id, delta) => {
const position = $<Vector>("position").get(id)!.value;
const collider = $<Collider>("collider").get(id)!.value;
const cPos = collider.aabb.position;
cPos.x = position.x;
cPos.y = position.y;
}); });