diff --git a/src/controller/gamecontext.ts b/src/controller/gamecontext.ts index f0a3346..38a08ed 100644 --- a/src/controller/gamecontext.ts +++ b/src/controller/gamecontext.ts @@ -94,34 +94,34 @@ export class GameContext { return diff; } + private updateStepCollide(out: vec2, dest: vec2): boolean { + const move = new Movement(this.entityPos, dest); + + for (const c of this.collision) { + if (!c.collide(out, move, this.collisionRadius)) + continue; + + if (vec2.squaredDistance(this.entityPos, out) >= vec2.squaredDistance(this.entityPos, dest)) + continue; + + return true; + } + + return false; + } + private updateStep(): void { const dest = vec2.scaleAndAdd(vec2.create(), this.entityPos, this.entityMovement, this.speed); - const dest2 = vec2.create(); - - let rescan = true; - - while (rescan) { - rescan = false; + const newDest = vec2.create(); + while (true) { if (vec2.equals(dest, this.entityPos)) return; - const move = new Movement(this.entityPos, dest); + if (!this.updateStepCollide(newDest, dest)) + break; - for (const c of this.collision) { - if (!c.collide(dest2, move, this.collisionRadius)) - continue; - - if (!vec2.exactEquals(dest, dest2)) { - // Ensure termination - if (vec2.squaredDistance(this.entityPos, dest2) >= vec2.squaredDistance(this.entityPos, dest)) - continue; - - vec2.copy(dest, dest2); - rescan = true; - break; - } - } + vec2.copy(dest, newDest); } vec2.copy(this.entityPos, dest);