feat(entities): afegeix stone i column com a muros decoratius
This commit is contained in:
1 parent
1c49248b72
commit
6749780356
18 files changed
+448
-36
No files matched your search
@@ -7,6 +7,7 @@
|
||||
#include "game/entities/concrete/door.hpp"
|
||||
#include "game/entities/concrete/sarcophagus.hpp"
|
||||
#include "game/entities/entity.hpp"
|
||||
#include "game/map/map.hpp"
|
||||
|
||||
// NOTA: `loadFromLevel` viu a `entity_manager_loadlevel.cpp` per evitar
|
||||
// arrossegar `Resource::Cache`, `Surface` i les seues dependències (GIF,
|
||||
@@ -51,12 +52,23 @@ EntityManager::EntityManager() {
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Connectar amb el check global de col·lisió del Map: les entitats
|
||||
// sòlides genèriques (debris, columnes, futurs murs) viuen al manager,
|
||||
// no a la graella fixa de sarcs, així que el `Map::collides` del Player
|
||||
// les ha de consultar via callback. Es desregistra al dtor.
|
||||
Map::setEntityCollider([this](const SDL_FRect& box) {
|
||||
return entityCollidesAt(box);
|
||||
});
|
||||
}
|
||||
|
||||
EntityManager::~EntityManager() {
|
||||
bus_.unsubscribe(sarc_sub_id_);
|
||||
bus_.unsubscribe(tile_sub_id_);
|
||||
bus_.unsubscribe(exit_sub_id_);
|
||||
// Desconnectar del Map: si quedem en namespace global apuntant a un
|
||||
// `this` que mor, qualsevol `Map::collides` posterior cauria en UB.
|
||||
Map::setEntityCollider(nullptr);
|
||||
}
|
||||
|
||||
void EntityManager::setExpectedPlayerCount(int n) {
|
||||
@@ -153,6 +165,17 @@ auto EntityManager::findFloorTriggerAt(const SDL_FRect& rect) const -> const Ent
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
auto EntityManager::entityCollidesAt(const SDL_FRect& box) const -> bool {
|
||||
// Iteració lineal sobre entitats amb `blocksMovement()`. La convenció
|
||||
// d'overlap és la mateixa que `Map::collides` (estricta: el toc al
|
||||
// píxel no compta) per coherència en els passadissos del laberint.
|
||||
return std::ranges::any_of(entities_, [&box](const auto& e) {
|
||||
if (!e->blocksMovement()) { return false; }
|
||||
const auto R = e->getCollisionRect();
|
||||
return (R.x + R.w) > box.x && (box.x + box.w) > R.x && (R.y + R.h) > box.y && (box.y + box.h) > R.y;
|
||||
});
|
||||
}
|
||||
|
||||
auto EntityManager::getEntities() const -> std::vector<Entity*> {
|
||||
std::vector<Entity*> out;
|
||||
out.reserve(entities_.size());
|
||||
|
||||
Reference in new issue
Block a user