diff --git a/docs/audit-game.md b/docs/audit-game.md index e3e5146..2e705c9 100644 --- a/docs/audit-game.md +++ b/docs/audit-game.md @@ -34,7 +34,7 @@ Els IDs es mantenen estables una vegada assignats. Cada entrada apunta al fitxer | DUP-02 | `player.cpp:100-140` | `snapToHorizontalLane` i `snapToVerticalLane` són el mateix algorisme amb eixos permutats | Importante | DONE | `snapToLane(dt, base, pitch, max_idx, get_pos, set_pos)` pren member-fn pointers; els dos wrappers deleguen només amb `Map::pitch_*`/`grid_*` distints | | DUP-03 | `options.cpp:14-62` | Tres parelles `enumToString`/`enumFromString` amb la mateixa forma | Menor | DONE | Tres `constexpr std::array, N>` + helpers `enumToString`/`enumFromString` plantilla. La primera entrada és el fallback (documentat). També elimina HC-07 | | DUP-04 | `options.cpp:79-149` | Cada `parse*` repeteix `if (node.contains) { ... get_value }` | Menor | DONE | Afegit `readField(node, key, dst)` plantilla a l'anonymous namespace. Aplicat a les 7 funcions `parse*` + `parsePostFXPreset`/`parseCrtPiPreset` | -| DUP-05 | `player.cpp:81-88` | Càlcul `MIN_/MAX_` + `clamp` per eix és la mateixa fórmula que el snap | Menor | PENDING | Fold en helper | +| DUP-05 | `player.cpp:81-88` | Càlcul `MIN_/MAX_` + `clamp` per eix és la mateixa fórmula que el snap | Menor | DONE | Extret `Player::clampToPlayfield()`; `update()` el crida després de la col·lisió per eix | ## 2. Hardcoding diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index f0b3e62..746ea03 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -105,6 +105,10 @@ void Player::update(float delta_time) { setPosY(NEW_Y); if (Map::collides(baseBox())) { setPosY(OLD_Y); } + clampToPlayfield(); +} + +void Player::clampToPlayfield() { // Límits de la zona jugable: la caixa de col·lisió no pot eixir del // playfield (muros). El cap del sprite sí pot sobresortir per damunt. const auto MIN_X = static_cast(Map::playfield_x - collision_x_offset); diff --git a/source/game/entities/player.hpp b/source/game/entities/player.hpp index a74b640..4ca4c5e 100644 --- a/source/game/entities/player.hpp +++ b/source/game/entities/player.hpp @@ -52,6 +52,10 @@ class Player : public AnimatedSprite { // a referència per al Z-order. [[nodiscard]] auto baseBox() const -> SDL_FRect; + // Clamp de la caixa de col·lisió al playfield (no al sprite sencer: + // el cap pot sobresortir pel mur superior sense afectar el joc). + void clampToPlayfield(); + // Snap cap al passadís perpendicular a la direcció premuda. Si la caixa // de col·lisió està a ≤ collision_size/2 d'una lane, s'hi aproxima // gradualment (a velocitat de moviment). Permet canviar de direcció