feat(map): door_col a la geometria + passadís de sortida a Map
This commit is contained in:
1 parent
63bb41425a
commit
b54f3fc622
3 files changed
+50
No files matched your search
@@ -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]
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
@@ -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};
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user