Implement circle collidables
This commit is contained in:
parent
5eae6f29a8
commit
e0eddb8741
4 changed files with 32 additions and 9 deletions
10
dist/resources/entity/red_circle.json
vendored
10
dist/resources/entity/red_circle.json
vendored
|
@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -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
15
src/math/circle.ts
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
Reference in a new issue