Implement circle collidables

This commit is contained in:
Matthias Schiffer 2018-11-08 22:26:11 +01:00
parent 5eae6f29a8
commit e0eddb8741
Signed by: neocturne
GPG key ID: 16EF3F64CB201D9C
4 changed files with 32 additions and 9 deletions

View file

@ -2,13 +2,9 @@
"sprite": "red_circle",
"collision": [
{
"type": "polygon",
"vertices": [
[-0.5, -0.5],
[-0.5, 0.5],
[0.5, 0.5],
[0.5, -0.5]
]
"type": "circle",
"center": [0, 0],
"radius": 0.46875
}
]
}

View file

@ -1,5 +1,6 @@
import { Collision } from '../model/data/collision';
import { Circle } from '../math/circle';
import { Collidable } from '../math/collision';
import { LineSegment, Movement } from '../math/line';
import { Point } from '../math/point';
@ -26,6 +27,11 @@ export function mkCollision(collision: Collision[]): Collidable[] {
ret.push(new Point(vec2.clone(v)));
prev = v;
}
break;
case 'circle':
ret.push(new Circle(vec2.clone(c.center), c.radius));
break;
}
}

15
src/math/circle.ts Normal file
View file

@ -0,0 +1,15 @@
import { Collidable } from './collision';
import { Movement } from './line';
import { Point } from './point';
import { vec2 } from 'gl-matrix';
export class Circle implements Collidable, Point {
private pointCollide = Point.prototype.collide;
constructor(public readonly p: vec2, public readonly r: number) {}
public collide(out: vec2, move: Movement, r: number): boolean {
return this.pointCollide(out, move, r + this.r);
}
}

View file

@ -1,6 +1,12 @@
export interface CollisionPolygon {
export interface PolygonCollision {
readonly type: 'polygon';
readonly vertices: Array<[number, number]>;
}
export type Collision = CollisionPolygon;
export interface CircleCollision {
readonly type: 'circle';
readonly center: [number, number];
readonly radius: number;
}
export type Collision = PolygonCollision | CircleCollision;