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", "sprite": "red_circle",
"collision": [ "collision": [
{ {
"type": "polygon", "type": "circle",
"vertices": [ "center": [0, 0],
[-0.5, -0.5], "radius": 0.46875
[-0.5, 0.5],
[0.5, 0.5],
[0.5, -0.5]
]
} }
] ]
} }

View file

@ -1,5 +1,6 @@
import { Collision } from '../model/data/collision'; import { Collision } from '../model/data/collision';
import { Circle } from '../math/circle';
import { Collidable } from '../math/collision'; import { Collidable } from '../math/collision';
import { LineSegment, Movement } from '../math/line'; import { LineSegment, Movement } from '../math/line';
import { Point } from '../math/point'; import { Point } from '../math/point';
@ -26,6 +27,11 @@ export function mkCollision(collision: Collision[]): Collidable[] {
ret.push(new Point(vec2.clone(v))); ret.push(new Point(vec2.clone(v)));
prev = 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 type: 'polygon';
readonly vertices: Array<[number, number]>; 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;