battle-city-js/src/GameLogic/collisionManager.js
2021-05-31 11:12:31 +02:00

84 lines
2.5 KiB
JavaScript

import { Constants } from "../constants";
import { Map } from "../Graphics/Map/map";
import { CollisionTypeEnum } from "./collisionType";
export class CollisionManager {
/**
* @type {Map}
*/
_map;
constructor() {
}
attachMap(map) {
this._map = map;
}
checkCollisionForTank(xMin, xMax, yMin, yMax) {
return (this._checkTankCollision(xMin, xMax, yMin, yMax) != null) ||
(this._checkBoundaries(xMin, xMax, yMin, yMax) != null) ||
(this._checkBlockCollision(xMin, xMax, yMin, yMax) != null);
}
checkCollisionForShots(xMin, xMax, yMin, yMax) {
}
_checkTankCollision(xMin, xMax, yMin, yMax) {
//TODO with AI tanks
return null;
}
_checkBoundaries(xMin, xMax, yMin, yMax) {
const tilesize = Constants.TILE_SIZE.getValue();
if (xMin < 0 || yMin < 0 || xMax > this._map.width * tilesize || yMax > this._map.height * tilesize)
return CollisionTypeEnum.Edge;
return null;
}
_checkBlockCollision(xMin, xMax, yMin, yMax) {
const blocksToCheck = this._getAllElementsOfMapOn(xMin, xMax, yMin, yMax);
const tilesize = Constants.TILE_SIZE.getValue();
for (let i = 0; i < blocksToCheck.length; i++) {
let boxes = blocksToCheck[i]["block"].getAllBoxes();
let x = blocksToCheck[i]["xPos"];
let y = blocksToCheck[i]["yPos"];
for (let j = 0; j < boxes.length; j++) {
const box = boxes[j];
if (this.intersect(xMin, xMax, yMin, yMax, x * tilesize + box.getXMin(), x * tilesize + box.getXMax(),
y * tilesize + box.getYMin(), y * tilesize + box.getYMax())) return CollisionTypeEnum.Block;
}
}
return null;
}
_getAllElementsOfMapOn(xMin, xMax, yMin, yMax) {
const tilesize = Constants.TILE_SIZE.getValue();
let elements = [];
for (let x = 0; x < this._map.width; x++) {
for (let y = 0; y < this._map.height; y++) {
if (this.intersect(xMin, xMax, yMin, yMax, x * tilesize, (x + 1) * tilesize, y * tilesize, (y + 1) * tilesize))
elements.push({
block: this._map.getElement(x, y),
xPos: x,
yPos: y
});
}
}
return elements;
}
intersect(xMin, xMax, yMin, yMax, anXMin, anXMax, anYMin, anYMax) {
return (xMin <= anXMax && xMax >= anXMin) &&
(yMin <= anYMax && yMax >= anYMin);
}
}