bool Escenario::agregarEntidad(Coordenada pos, Entidad* entidad){ if (!coordEnEscenario(pos)) throw FueraDeEscenario(); try { pair<int,int> dim = entidad->getTam(); // Se fija que todos los tiles a ocupar estén vacíos antes de ocuparlos for (int j = 0; j < dim.second; j++) for (int i = 0; i < dim.first; i++){ Tile* tile = this->matriz_tiles[pos.x+i][pos.y+j]; if (!tile->estaLibre()) throw TileEstaOcupado(); } for (int j = 0; j < dim.second; j++){ for (int i = 0; i < dim.first; i++){ Tile* tile = this->matriz_tiles[pos.x+i][pos.y+j]; if (i==round(dim.first/2.0)-1 && j==round(dim.second/2.0)-1) tile->agregarEntidad(entidad, true); else tile->agregarEntidad(entidad); } } // Se guardan en posicionesEntidades todas las entidades agregadas al mapa. No se lo limpia TODO posicionesEntidades->push_back(entidad); } catch ( TileEstaOcupado &e ) { Log::imprimirALog(ERR,"Se intentó agregar una entidad en un tile ocupado "+entidad->enc()); return false; } return true; }
void Escenario::actualizarPosicionParaEntidad(Coordenada c, Entidad* entidad){ /* Si las coordenadas no son iguales, actualizar la coordenada de cualquier entidad */ if (entidad->getPosicion() != c) { Tile* tile = getTile(entidad->getPosicion()); try { if (tile != NULL) tile->eliminarEntidad(entidad); } catch ( NoSeRecibio &e ) { Log::imprimirALog(ERR, "No se encontró entidad en posición buscada, se creó una repetida?"); } /* agregamos la entidad a su nuevo tile */ tile = getTile(c.x, c.y); if (tile != NULL) tile->agregarEntidad(entidad); entidad->setPosicion(c); } }