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",
|
"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]
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
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 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;
|
||||||
|
|
Reference in a new issue