controller/gamecontext: refactor collision code

This commit is contained in:
Matthias Schiffer 2018-11-05 23:39:55 +01:00
parent f086908e08
commit a3962f36aa
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C

View file

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