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 { 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<Collision> {
const colliders = $<Collider>("collider")!;
const positions = $<Vector>("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;
+2 -2
View File
@@ -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) => {
+19 -5
View File
@@ -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 = $<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;
});