treballant en el extendedMap per a les colisións fora de pantalla
This commit is contained in:
@@ -3,15 +3,31 @@
|
||||
#include <vector>
|
||||
|
||||
#include "game/gameplay/tile_collider.hpp"
|
||||
#include "utils/defines.hpp"
|
||||
|
||||
/**
|
||||
* @brief Mapa de colisiones de una habitación
|
||||
*
|
||||
* Contiene el collision_tile_map (grid de tipos de tile) y el TileCollider
|
||||
* que proporciona queries de colisión directas contra el grid.
|
||||
* Contiene el collision_tile_map original (32×21) y un tilemap extendido (38×27)
|
||||
* que incluye tiles de borde de las habitaciones adyacentes.
|
||||
* El TileCollider opera sobre el mapa extendido, permitiendo colisiones cross-room
|
||||
* sin lógica especial en el Player.
|
||||
*/
|
||||
class CollisionMap {
|
||||
public:
|
||||
// Datos de colisión de las habitaciones adyacentes (punteros a sus collision_tile_map).
|
||||
// nullptr = sin habitación en esa dirección (borde queda como EMPTY).
|
||||
struct AdjacentData {
|
||||
const std::vector<int>* top{nullptr};
|
||||
const std::vector<int>* bottom{nullptr};
|
||||
const std::vector<int>* left{nullptr};
|
||||
const std::vector<int>* right{nullptr};
|
||||
const std::vector<int>* top_left{nullptr};
|
||||
const std::vector<int>* top_right{nullptr};
|
||||
const std::vector<int>* bottom_left{nullptr};
|
||||
const std::vector<int>* bottom_right{nullptr};
|
||||
};
|
||||
|
||||
CollisionMap(std::vector<int> collision_tile_map, int conveyor_belt_direction);
|
||||
~CollisionMap() = default;
|
||||
|
||||
@@ -20,21 +36,36 @@ class CollisionMap {
|
||||
CollisionMap(CollisionMap&&) = delete;
|
||||
auto operator=(CollisionMap&&) -> CollisionMap& = delete;
|
||||
|
||||
// Rellena los bordes del mapa extendido con tiles de las habitaciones adyacentes.
|
||||
void updateBorders(const AdjacentData& adjacent);
|
||||
|
||||
[[nodiscard]] auto getTileCollider() const -> const TileCollider& { return tile_collider_; }
|
||||
[[nodiscard]] auto getConveyorBeltDirection() const -> int { return conveyor_belt_direction_; }
|
||||
[[nodiscard]] auto getCollisionTileMap() const -> const std::vector<int>& { return collision_tile_map_; }
|
||||
|
||||
#ifdef _DEBUG
|
||||
void setCollisionTile(int index, int value) {
|
||||
if (index >= 0 && index < static_cast<int>(collision_tile_map_.size())) {
|
||||
collision_tile_map_[index] = value;
|
||||
}
|
||||
}
|
||||
void setCollisionTile(int index, int value);
|
||||
void setConveyorBeltDirection(int direction) { conveyor_belt_direction_ = direction; }
|
||||
#endif
|
||||
|
||||
private:
|
||||
std::vector<int> collision_tile_map_;
|
||||
static constexpr int B = CollisionBorder::TILES; // Tiles de borde
|
||||
static constexpr int MW = Map::WIDTH; // Ancho original (32)
|
||||
static constexpr int MH = Map::HEIGHT; // Alto original (21)
|
||||
static constexpr int EW = ExtendedMap::WIDTH; // Ancho extendido (38)
|
||||
static constexpr int EH = ExtendedMap::HEIGHT; // Alto extendido (27)
|
||||
|
||||
std::vector<int> collision_tile_map_; // Original (32×21)
|
||||
std::vector<int> extended_tile_map_; // Extendido (38×27) — referenciado por TileCollider
|
||||
int conveyor_belt_direction_;
|
||||
TileCollider tile_collider_;
|
||||
TileCollider tile_collider_; // Debe ir después de extended_tile_map_ (usa referencia)
|
||||
|
||||
// Copia el centro (room actual) al mapa extendido. Los bordes quedan como EMPTY (0).
|
||||
void buildExtendedCenter();
|
||||
|
||||
// Copia una región rectangular de un tilemap fuente (MW×MH) al mapa extendido.
|
||||
void copyRegion(const std::vector<int>& src,
|
||||
int src_col, int src_row,
|
||||
int dst_col, int dst_row,
|
||||
int cols, int rows);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user