feat(entity-manager): reload del nivell + PaintLayer::clear

This commit is contained in:
JailDesigner committed 2026-04-26 10:26:07 +02:00
1 parent 28e55a0615
commit 59cd9b524c
4 files changed
+43

No files matched your search

+10
View File
@@ -90,6 +90,16 @@ class EntityManager {
// `Map::tile_size`, `tilemap_origin_*` i `getSarcRect`). // `Map::tile_size`, `tilemap_origin_*` i `getSarcRect`).
void loadFromLevel(const std::string& level_yaml_path); void loadFromLevel(const std::string& level_yaml_path);
// Reset complet del nivell: destrueix totes les entitats, reseteja
// els comptadors interns (sarcòfags oberts, total, exited, flag de
// level_complete) i torna a cridar `loadFromLevel` per regenerar les
// entitats des del YAML. El bus i les seues subscripcions
// sobreviuen — això inclou les subscripcions externes (paint_layer_,
// hud_, players, GameScene). Cridat des de GameScene a la transició
// ROOM_OUTRO → ROOM_INTRO. `setExpectedPlayerCount` cal cridar-lo de
// nou després si vols agregació de level_complete al nou cicle.
void reload(const std::string& level_yaml_path);
// Fixa quants jugadors actius es consideren al recompte d'EXITED. // Fixa quants jugadors actius es consideren al recompte d'EXITED.
// Cridat per GameScene un cop instanciats els jugadors. Si manca, // Cridat per GameScene un cop instanciats els jugadors. Si manca,
// `expected_players_ = 0` i mai s'emet `level_complete` automàticament. // `expected_players_ = 0` i mai s'emet `level_complete` automàticament.
@@ -355,6 +355,25 @@ namespace {
} }
} // namespace } // namespace
void EntityManager::reload(const std::string& level_yaml_path) {
// Destrucció ordenada: les entitats moren aquí; les seues
// subscripcions implícites desapareixen amb la seua vida (cap d'elles
// se subscriu directament al bus — només publiquen). El bus i les
// subscripcions externes (PaintLayer, HUD, GameScene) no es toquen.
entities_.clear();
door_ = nullptr;
total_sarcs_ = 0;
opened_sarcs_ = 0;
// No reset de `expected_players_`: GameScene el tornarà a fixar
// (amb el mateix valor o un de nou) després del reload, com a part
// del respawn dels jugadors. Reseteig dels comptadors d'EXITED i
// del flag d'emissió perquè el cicle següent pugui reagregar net.
exited_players_ = 0;
level_complete_emitted_ = false;
loadFromLevel(level_yaml_path);
}
void EntityManager::loadFromLevel(const std::string& level_yaml_path) { void EntityManager::loadFromLevel(const std::string& level_yaml_path) {
const auto SPAWNS = EntityLoader::readSpawns(level_yaml_path); const auto SPAWNS = EntityLoader::readSpawns(level_yaml_path);
int loaded = 0; int loaded = 0;
+7
View File
@@ -82,6 +82,13 @@ auto PaintLayer::isPainted(int col, int row) const -> bool {
return painted_[static_cast<std::size_t>(row)][static_cast<std::size_t>(col)] >= 0; return painted_[static_cast<std::size_t>(row)][static_cast<std::size_t>(col)] >= 0;
} }
void PaintLayer::clear() {
// Mateixa geometria que al ctor: matriu de tiles a -1 (no pintat) i
// buffer ARGB a zero (alpha=0 = transparent → render no escriu res).
painted_.assign(static_cast<std::size_t>(rows_), std::vector<int>(static_cast<std::size_t>(cols_), -1));
std::ranges::fill(pixels_, 0U);
}
auto PaintLayer::tryPaint(int col, int row, int tile_index, int player_id) -> bool { auto PaintLayer::tryPaint(int col, int row, int tile_index, int player_id) -> bool {
if (col < 0 || col >= cols_ || row < 0 || row >= rows_) { return false; } if (col < 0 || col >= cols_ || row < 0 || row >= rows_) { return false; }
if (tile_index < 0) { return false; } if (tile_index < 0) { return false; }
+7
View File
@@ -48,6 +48,13 @@ class PaintLayer {
[[nodiscard]] auto isPainted(int col, int row) const -> bool; [[nodiscard]] auto isPainted(int col, int row) const -> bool;
// Buida el pintat acumulat. Marca tots els tiles com a no pintats i
// reseteja el buffer ARGB a alpha=0 (transparent). Cridat per
// GameScene a la transició ROOM_OUTRO → ROOM_INTRO. La subscripció
// al bus es manté — el PaintLayer continuarà reaccionant a
// `on_tile_entered` un cop els jugadors hagin reaparegut.
void clear();
private: private:
void blitPaintTile(int col, int row, int tile_index); void blitPaintTile(int col, int row, int tile_index);