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); } }