Implement collision handling
This commit is contained in:
parent
a09b58b54c
commit
6c896c3f23
3 changed files with 91 additions and 38 deletions
|
@ -19,7 +19,18 @@ export default class MapContext {
|
||||||
playerEntity: EntityPosition;
|
playerEntity: EntityPosition;
|
||||||
|
|
||||||
|
|
||||||
|
collision: number[][];
|
||||||
|
|
||||||
|
|
||||||
constructor(private map: MapData, private inputHandler: InputHandler) {
|
constructor(private map: MapData, private inputHandler: InputHandler) {
|
||||||
|
this.collision = new Array(map.width);
|
||||||
|
for (let i = 0; i < map.width; i++) {
|
||||||
|
this.collision[i] = new Array(map.height);
|
||||||
|
|
||||||
|
for (let j = 0; j < map.height; j++)
|
||||||
|
this.collision[i][j] = map.collision[j][i] == '0' ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
this.playerEntity = new EntityPosition(
|
this.playerEntity = new EntityPosition(
|
||||||
new Entity('square'),
|
new Entity('square'),
|
||||||
new Position(8, 8),
|
new Position(8, 8),
|
||||||
|
@ -28,6 +39,12 @@ export default class MapContext {
|
||||||
|
|
||||||
this.addEntity(this.playerEntity);
|
this.addEntity(this.playerEntity);
|
||||||
|
|
||||||
|
this.addEntity(new EntityPosition(
|
||||||
|
new Entity('square'),
|
||||||
|
new Position(10, 10),
|
||||||
|
Direction.East
|
||||||
|
));
|
||||||
|
|
||||||
this.view = new MapView(
|
this.view = new MapView(
|
||||||
map,
|
map,
|
||||||
this.entities,
|
this.entities,
|
||||||
|
@ -41,24 +58,49 @@ export default class MapContext {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private incCollision(p: Position) {
|
||||||
|
if (this.collision[p.x] && !_.isUndefined(this.collision[p.x][p.y]))
|
||||||
|
this.collision[p.x][p.y]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
private decCollision(p: Position) {
|
||||||
|
if (this.collision[p.x] && !_.isUndefined(this.collision[p.x][p.y]))
|
||||||
|
this.collision[p.x][p.y]--;
|
||||||
|
}
|
||||||
|
|
||||||
|
private collides(p: Position): boolean {
|
||||||
|
if (this.collision[p.x] && !_.isUndefined(this.collision[p.x][p.y]))
|
||||||
|
return (this.collision[p.x][p.y] > 0);
|
||||||
|
else
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private addEntity(entity: EntityPosition) {
|
private addEntity(entity: EntityPosition) {
|
||||||
this.entities.push(entity);
|
this.entities.push(entity);
|
||||||
|
|
||||||
|
this.incCollision(entity.position);
|
||||||
}
|
}
|
||||||
|
|
||||||
private addTransition(entity: EntityPosition, dest: Position, start: number, dur: number) {
|
private addTransition(entity: EntityPosition, dest: Position, start: number, dur: number) {
|
||||||
entity.transition = new Transition(start, start+dur, entity.position, dest);
|
entity.transition = new Transition(start, start+dur, entity.position, dest);
|
||||||
|
|
||||||
|
this.incCollision(dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
private finishTransition(entity: EntityPosition) {
|
private finishTransition(entity: EntityPosition) {
|
||||||
|
this.decCollision(entity.position);
|
||||||
|
|
||||||
entity.position = entity.transition.dest;
|
entity.position = entity.transition.dest;
|
||||||
entity.transition = null;
|
entity.transition = null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateState(time: number): boolean {
|
private updateState(time: number): boolean {
|
||||||
var ret = false;
|
var ret = false;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
var origTime = time;
|
let origTime = time;
|
||||||
|
|
||||||
if (this.playerEntity.transition && this.playerEntity.transition.end <= time) {
|
if (this.playerEntity.transition && this.playerEntity.transition.end <= time) {
|
||||||
origTime = this.playerEntity.transition.end;
|
origTime = this.playerEntity.transition.end;
|
||||||
|
@ -69,7 +111,7 @@ export default class MapContext {
|
||||||
if (this.playerEntity.transition)
|
if (this.playerEntity.transition)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
var dir: Direction = null;
|
let dir: Direction = null;
|
||||||
|
|
||||||
if (this.inputHandler.keys[InputHandler.Up])
|
if (this.inputHandler.keys[InputHandler.Up])
|
||||||
dir = Direction.North;
|
dir = Direction.North;
|
||||||
|
@ -84,8 +126,13 @@ export default class MapContext {
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
this.playerEntity.direction = dir;
|
this.playerEntity.direction = dir;
|
||||||
this.addTransition(this.playerEntity, this.playerEntity.position.translate(dir, 1),
|
ret = true;
|
||||||
origTime, 250);
|
|
||||||
|
let dest = this.playerEntity.position.translate(dir, 1);
|
||||||
|
if (this.collides(dest))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
this.addTransition(this.playerEntity, dest, origTime, 250);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,12 +9,18 @@ interface Input {
|
||||||
|
|
||||||
export default class MapData {
|
export default class MapData {
|
||||||
tiles: {[key: string]: {file: string}};
|
tiles: {[key: string]: {file: string}};
|
||||||
public collision: string[];
|
collision: string[];
|
||||||
public layers: string[][][];
|
layers: string[][][];
|
||||||
|
|
||||||
|
width: number;
|
||||||
|
height: number;
|
||||||
|
|
||||||
constructor(data: Input) {
|
constructor(data: Input) {
|
||||||
this.tiles = data.tiles;
|
this.tiles = data.tiles;
|
||||||
this.collision = data.collision;
|
this.collision = data.collision;
|
||||||
this.layers = data.layers;
|
this.layers = data.layers;
|
||||||
|
|
||||||
|
this.height = this.collision.length;
|
||||||
|
this.width = this.collision[0].length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,38 +5,38 @@
|
||||||
">": {"rotate": 0, "file": "road_right"}
|
">": {"rotate": 0, "file": "road_right"}
|
||||||
},
|
},
|
||||||
"collision": [
|
"collision": [
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111",
|
"00000000000110000000000000000000",
|
||||||
"11111111111111111111111111111111"
|
"00000000000000000000000000000000"
|
||||||
],
|
],
|
||||||
"layers": [
|
"layers": [
|
||||||
[
|
[
|
||||||
|
|
Reference in a new issue