diff --git a/engine/system/physics.ts b/engine/system/physics.ts index f65108e..3bde81f 100644 --- a/engine/system/physics.ts +++ b/engine/system/physics.ts @@ -43,27 +43,10 @@ function createCollisionBuffer(size: number): CollisionBuffer { }; } -function bufferNext(buffer: CollisionBuffer): Collision { +function next(buffer: CollisionBuffer): Collision { return buffer.pool[buffer.cursor++ & buffer.mask]; } -function bufferSliceReset(buffer: CollisionBuffer): void { - buffer.slice.length = 0; -} - -function bufferSliceAdd(buffer: CollisionBuffer): Collision { - const next = bufferNext(buffer); - buffer.slice.push(next); - - return next; -} - -export type Collider = { - shape: ShapeType; - body: Circle | Rect | Polygon; - buffer: CollisionBuffer; -}; - export type Collision = { cid: string; normal: Vector; @@ -82,16 +65,25 @@ function createCollision(): Collision { }; } -export function createCollider( - shape: ShapeType, - body: Circle | Rect | Polygon, - bufferSize: number = 8, -): Collider { - return { - shape, - body, - buffer: createCollisionBuffer(bufferSize), - }; +export class Collider { + shapeType: ShapeType; + body: Circle | Rect | Polygon; + buffer: CollisionBuffer; + + constructor( + shape: ShapeType, + body: Circle | Rect | Polygon, + bufferSize: number = 8, + ) { + this.shapeType = shape; + this.body = body; + this.buffer = createCollisionBuffer(bufferSize); + } + + // FIXME: sTruCtUrEd ClOnE >.< + collideWithCircle(collision: Collision, cid: string): void { + collision.cid = cid; + } } export function moveAndCollide( @@ -100,16 +92,34 @@ export function moveAndCollide( delta: number, ): Array { const colliders = $("collider")!; - const self = colliders.get(id)!.value; - bufferSliceReset(self.buffer); + const self = colliders.get(id)!; + console.log(id, self); + const slice = self.value.buffer.slice; + slice.length = 0; - for (const [cid, _] of colliders.entries()) { + for (const [cid, collider] of colliders.entries()) { if (cid === id) { continue; } - const collisoin = bufferSliceAdd(self.buffer); - collisoin.cid = cid; + + const collision = next(self.value.buffer); + switch (collider.value.shapeType) { + case CIRCLE: { + // FIXME: sTruCtUrEd ClOnE >.< + self.value.collideWithCircle(collision, cid); + break; + } + case RECT: { + break; + } + case POLYGON: { + break; + } + } + if (collision.cid.length > 0) { + slice.push(collision); + } } - return self.buffer.slice; + return slice; } diff --git a/game/entities/hero/entity.ts b/game/entities/hero/entity.ts index 78a8e4f..905bba4 100644 --- a/game/entities/hero/entity.ts +++ b/game/entities/hero/entity.ts @@ -9,7 +9,7 @@ import { defineSpriteSheet, } from "#/engine/Sprite.ts"; import { - createCollider, + Collider, moveAndCollide, Shape, } from "#/engine/system/physics.ts"; @@ -24,7 +24,7 @@ const process = defineEntity("hero", { sprite: createSprite(idleSrc), animation: createSpriteAnimation(500, 2), velocity: createVector(), - collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), + collider: new Collider(Shape.Cirle, createCircle(createVector(), 8)), }); process((id, delta) => { diff --git a/game/entities/portal/entity.ts b/game/entities/portal/entity.ts index 2c7b0f0..d2b0bb8 100644 --- a/game/entities/portal/entity.ts +++ b/game/entities/portal/entity.ts @@ -5,7 +5,7 @@ import { createSpriteAnimation, defineSpriteSheet, } from "#/engine/Sprite.ts"; -import { createCollider, Shape } from "#/engine/system/physics.ts"; +import { Collider, Shape } from "#/engine/system/physics.ts"; import { createVector } from "#/engine/Vector.ts"; import portal from "#/game/assets/portal.png"; @@ -15,5 +15,5 @@ defineEntity("portal", { position: createVector(), sprite: createSprite(portalSrc), animation: createSpriteAnimation(400, 0), - collider: createCollider(Shape.Cirle, createCircle(createVector(), 8)), + collider: new Collider(Shape.Cirle, createCircle(createVector(), 8)), });