feat(map): door_col a la geometria + passadís de sortida a Map

This commit is contained in:
JailDesigner committed 2026-04-26 10:05:32 +02:00
1 parent 63bb41425a
commit b54f3fc622
3 files changed
+50

No files matched your search

+6
View File
@@ -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]
+19
View File
@@ -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<int>() : 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,
};
+25
View File
@@ -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};
};