From b54f3fc62265697b93508ae32a8f602da0943a77 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sun, 26 Apr 2026 10:05:32 +0200 Subject: [PATCH] =?UTF-8?q?feat(map):=20door=5Fcol=20a=20la=20geometria=20?= =?UTF-8?q?+=20passad=C3=ADs=20de=20sortida=20a=20Map?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/maps/pyramid.yaml | 6 ++++++ source/game/map/map.cpp | 19 +++++++++++++++++++ source/game/map/map.hpp | 25 +++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/data/maps/pyramid.yaml b/data/maps/pyramid.yaml index 13f5bfd..6111eab 100644 --- a/data/maps/pyramid.yaml +++ b/data/maps/pyramid.yaml @@ -42,6 +42,12 @@ geometry: hud_h: 24 back_wall_h: 24 side_wall_w: 24 + # Columna central del tile transitable de la porta. La porta es renderitza + # com a sprite 48×32 (3 tiles d'amplada) centrat sobre aquesta columna; els + # 16 px centrals (just aquesta columna) són el "forat" del mur trasser per + # on el jugador surt de la sala. Les 2 columnes flanquejants segueixen sent + # mur visible. El spawn dels jugadors també s'alinea amb aquesta columna. + door_col: 10 data: - [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] diff --git a/source/game/map/map.cpp b/source/game/map/map.cpp index 12c1048..f199505 100644 --- a/source/game/map/map.cpp +++ b/source/game/map/map.cpp @@ -75,9 +75,24 @@ namespace Map { playfield_w = board_w + (2 * outer_corridor); playfield_h = board_h + (2 * outer_corridor); + // Porta i passadís de sortida. `door_col` és la columna central + // transitable; el passadís són exactament els 16 px d'eixa columna + // dins del strip del mur trasser. Si manca la clau, `door_col=0` + // i el passadís queda a x=0 amb mida zero — pràcticament inactiu + // (el bloqueig del clamp continua sent el rectangle del playfield). + door_col = g.contains("door_col") ? g["door_col"].get_value() : 0; + door_corridor_x = (door_col * tile_size) + tilemap_origin_x; + door_corridor_y = hud_h; + door_corridor_w = tile_size; + door_corridor_h = back_wall_h; + // Cada càrrega de nivell deixa la porta tancada; l'entitat Door + // canviarà el flag a true quan transiti a OPEN. + door_open = false; + std::cout << "Map: geometria " << grid_cols << "x" << grid_rows << " sarcs " << sarc_w << "x" << sarc_h << " pitch " << pitch_x << "x" << pitch_y + << " door_col " << door_col << " des de " << yaml_path << '\n'; } @@ -136,6 +151,10 @@ namespace Map { .tile_size = tile_size, .tilemap_origin_x = tilemap_origin_x, .tilemap_origin_y = tilemap_origin_y, + .door_corridor_x = door_corridor_x, + .door_corridor_y = door_corridor_y, + .door_corridor_w = door_corridor_w, + .door_corridor_h = door_corridor_h, .collides = &collides, .inside_playfield = &insidePlayfield, }; diff --git a/source/game/map/map.hpp b/source/game/map/map.hpp index 895469f..62cf463 100644 --- a/source/game/map/map.hpp +++ b/source/game/map/map.hpp @@ -62,6 +62,24 @@ namespace Map { inline int playfield_w = 0; inline int playfield_h = 0; + // Porta de sortida del nivell. La porta sempre viu al mur trasser + // (`wall_north`); només la columna varia per nivell. `door_col` és la + // columna central transitable: el sprite 48×32 es dibuixa centrat + // sobre aquesta columna i els 16 px centrals (just `door_col`) són + // l'únic forat del mur trasser per on el jugador surt. Derivat de + // `geometry.door_col` al YAML. + inline int door_col = 0; + inline int door_corridor_x = 0; + inline int door_corridor_y = 0; + inline int door_corridor_w = 0; + inline int door_corridor_h = 0; + // Estat del passadís: si la porta està oberta, el `door_corridor` no + // bloqueja el moviment del jugador (vegeu `Map::collides`). Qui muta + // aquest flag és l'entitat `Door` quan transita CLOSED → OPEN; el + // reset el porta `Map::loadFrom` (cada càrrega de nivell el torna a + // posar a false). + inline bool door_open = false; + // Carrega el bloc `geometry:` del YAML i recalcula tots els derivats. // Ha de cridar-se abans d'instanciar `Player` o consultar `collides()`: // GameScene ho fa al ctor. @@ -104,6 +122,13 @@ namespace Map { int tile_size{0}; int tilemap_origin_x{0}; int tilemap_origin_y{0}; + // Passadís de sortida (forat del mur trasser a la columna de la + // porta). El Player l'usa des del clamp per permetre pujar al + // strip del mur quan la base box queda dins del rang X. + int door_corridor_x{0}; + int door_corridor_y{0}; + int door_corridor_w{0}; + int door_corridor_h{0}; bool (*collides)(const SDL_FRect&){nullptr}; bool (*inside_playfield)(const SDL_FRect&){nullptr}; };