HC-06: rutes d'assets de GameScene a Defaults::Pyramid + Config
Afegits `Defaults::Pyramid::{MAP_YAML, PLAYER_SPRITE, PLAYER_YAML,
MUSIC_TRACK}` a utils/defaults.hpp. `GameScene` exposa `Config` i
`defaultConfig()`; el ctor accepta Config (default = Defaults::Pyramid)
i usa els camps enlloc dels literals. `Player` passa a rebre el anim_key
per constructor en lloc de cablejar "player.yaml". Cache key = basename
(convenció preexistent). Cada piràmide futura serà un Config distint.
This commit is contained in:
1 parent
e84d8cc535
commit
505e819af1
6 files changed
+60
-20
No files matched your search
+1
-1
@@ -45,7 +45,7 @@ Els IDs es mantenen estables una vegada assignats. Cada entrada apunta al fitxer
|
|||||||
| HC-03 | `map.hpp:18-62` | Tota la geometria del mapa + 4 índexs de paleta en `.hpp` | Crítico | DONE | Bloc `geometry:` afegit a `pyramid.yaml`; `Map` exposa `inline static int` + `loadFrom(yaml)`; derivats (CORRIDOR/BOARD/ORIGIN/PLAYFIELD) recalculats al load. `constexpr` → `const` en els locals dependents a `player.cpp` i `game_scene.cpp`. Índexs de paleta queden per DEAD-02 |
|
| HC-03 | `map.hpp:18-62` | Tota la geometria del mapa + 4 índexs de paleta en `.hpp` | Crítico | DONE | Bloc `geometry:` afegit a `pyramid.yaml`; `Map` exposa `inline static int` + `loadFrom(yaml)`; derivats (CORRIDOR/BOARD/ORIGIN/PLAYFIELD) recalculats al load. `constexpr` → `const` en els locals dependents a `player.cpp` i `game_scene.cpp`. Índexs de paleta queden per DEAD-02 |
|
||||||
| HC-04 | `notification_presets.hpp:24-38` | `text_color`, `bg_color`, `time_ms` en `constexpr` | Menor | PENDING | Bloc `notifications:` a `config.yaml` o tema extern |
|
| HC-04 | `notification_presets.hpp:24-38` | `text_color`, `bg_color`, `time_ms` en `constexpr` | Menor | PENDING | Bloc `notifications:` a `config.yaml` o tema extern |
|
||||||
| HC-05 | `ui_palette.hpp:12-21` | Índexs de paleta (`RENDER_INFO_TEXT=47`, `SHADOW=34`, `CANVAS_BG=65`) en `constexpr` | Menor | PENDING | Bloc `ui:` a `config.yaml` |
|
| HC-05 | `ui_palette.hpp:12-21` | Índexs de paleta (`RENDER_INFO_TEXT=47`, `SHADOW=34`, `CANVAS_BG=65`) en `constexpr` | Menor | PENDING | Bloc `ui:` a `config.yaml` |
|
||||||
| HC-06 | `game_scene.cpp:24-26,52` | Rutes `data/maps/pyramid.yaml`, `data/player/player.*`, `pyramid_1.ogg` cablejades | Importante | PENDING | Paràmetre del ctor o `scenes.yaml` |
|
| HC-06 | `game_scene.cpp:24-26,52` | Rutes `data/maps/pyramid.yaml`, `data/player/player.*`, `pyramid_1.ogg` cablejades | Importante | DONE | Afegit `Defaults::Pyramid::{MAP_YAML,PLAYER_SPRITE,PLAYER_YAML,MUSIC_TRACK}`; `GameScene::Config` struct + `defaultConfig()` passa les rutes al ctor (default ve de Defaults). `Player` ctor accepta `anim_key` en lloc de cablejar `"player.yaml"`. Cache key = basename (mateix conveni que abans) |
|
||||||
| HC-07 | `options.cpp:27,55` | Fallbacks `"letterbox"`/`"off"` com a strings màgics que dupliquen els enums | Menor | PENDING | Passar per `toString(Defaults::...)` |
|
| HC-07 | `options.cpp:27,55` | Fallbacks `"letterbox"`/`"off"` com a strings màgics que dupliquen els enums | Menor | PENDING | Passar per `toString(Defaults::...)` |
|
||||||
| HC-08 | `tilemap.cpp:135` | `0xFF000000U` com a màscara alfa | Menor | PENDING | Constant amb nom a `defines.hpp` |
|
| HC-08 | `tilemap.cpp:135` | `0xFF000000U` com a màscara alfa | Menor | PENDING | Constant amb nom a `defines.hpp` |
|
||||||
|
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ void Player::loadFrom(const std::string& yaml_path) {
|
|||||||
collision_y_offset = (sprite_h - base_size) - collision_padding;
|
collision_y_offset = (sprite_h - base_size) - collision_padding;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player::Player(float x, float y, const Controls& controls)
|
Player::Player(const std::string& anim_key, float x, float y, const Controls& controls)
|
||||||
: AnimatedSprite(Resource::Cache::get().getAnimationData("player.yaml")),
|
: AnimatedSprite(Resource::Cache::get().getAnimationData(anim_key)),
|
||||||
controls_(controls) {
|
controls_(controls) {
|
||||||
setPos(x, y);
|
setPos(x, y);
|
||||||
setCurrentAnimation("stand");
|
setCurrentAnimation("stand");
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ class Player : public AnimatedSprite {
|
|||||||
// Ha de cridar-se abans d'instanciar Player; GameScene ho fa al ctor.
|
// Ha de cridar-se abans d'instanciar Player; GameScene ho fa al ctor.
|
||||||
static void loadFrom(const std::string& yaml_path);
|
static void loadFrom(const std::string& yaml_path);
|
||||||
|
|
||||||
Player(float x, float y, const Controls& controls);
|
Player(const std::string& anim_key, float x, float y, const Controls& controls);
|
||||||
|
|
||||||
void update(float delta_time) override;
|
void update(float delta_time) override;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,9 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <filesystem>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "core/audio/audio.hpp"
|
#include "core/audio/audio.hpp"
|
||||||
@@ -23,25 +25,39 @@
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
// La geometria ha de quedar inicialitzada abans que Tilemap parsejar el
|
// La geometria ha de quedar inicialitzada abans que Tilemap parsejar el
|
||||||
// mateix YAML i abans que el ctor de Player consulte Map::PLAYFIELD_*.
|
// mateix YAML i abans que el ctor de Player consulte Map::playfield_*.
|
||||||
// Cridar-la des d'una expressió que retorne la ruta permet encadenar-ho
|
// Construïm el Tilemap via un helper que primer carrega la geometria
|
||||||
// a l'init list sense fer Tilemap default-constructible.
|
// i després retorna el Tilemap per valor (move-construït).
|
||||||
auto loadMapGeometry(const char* yaml_path) -> const char* {
|
auto makeTilemap(const std::string& yaml_path) -> Tilemap {
|
||||||
Map::loadFrom(yaml_path);
|
Map::loadFrom(yaml_path);
|
||||||
return yaml_path;
|
return Tilemap(yaml_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
GameScene::GameScene()
|
auto GameScene::defaultConfig() -> Config {
|
||||||
: tilemap_(loadMapGeometry("data/maps/pyramid.yaml")) {
|
return {
|
||||||
Resource::Cache::get().loadSurface("player.gif", "data/player/player.gif");
|
.map_yaml = Defaults::Pyramid::MAP_YAML,
|
||||||
Resource::Cache::get().loadAnimation("player.yaml", "data/player/player.yaml");
|
.player_sprite = Defaults::Pyramid::PLAYER_SPRITE,
|
||||||
|
.player_yaml = Defaults::Pyramid::PLAYER_YAML,
|
||||||
|
.music_track = Defaults::Pyramid::MUSIC_TRACK,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
GameScene::GameScene(Config config)
|
||||||
|
: config_(std::move(config)),
|
||||||
|
tilemap_(makeTilemap(config_.map_yaml)) {
|
||||||
|
// Convenció: el Resource::Cache indexa per basename del fitxer, perquè
|
||||||
|
// la mateixa clau l'usa el parseador d'animació (YAML > tileSetFile).
|
||||||
|
const auto SPRITE_KEY = std::filesystem::path(config_.player_sprite).filename().string();
|
||||||
|
const auto ANIM_KEY = std::filesystem::path(config_.player_yaml).filename().string();
|
||||||
|
Resource::Cache::get().loadSurface(SPRITE_KEY, config_.player_sprite);
|
||||||
|
Resource::Cache::get().loadAnimation(ANIM_KEY, config_.player_yaml);
|
||||||
|
|
||||||
// Geometria de col·lisió del jugador (caixa 16×16, base 12): carregada
|
// Geometria de col·lisió del jugador (caixa 16×16, base 12): carregada
|
||||||
// del mateix YAML que l'animació. Ha d'estar feta abans d'instanciar
|
// del mateix YAML que l'animació. Ha d'estar feta abans d'instanciar
|
||||||
// Player perquè el spawn consulta `collision_*`.
|
// Player perquè el spawn consulta `collision_*`.
|
||||||
Player::loadFrom("data/player/player.yaml");
|
Player::loadFrom(config_.player_yaml);
|
||||||
|
|
||||||
// Jugador 0: fletxes del teclat (Defaults::KeysGame). Instanciar-ne un
|
// Jugador 0: fletxes del teclat (Defaults::KeysGame). Instanciar-ne un
|
||||||
// segon només requereix afegir una altra entrada amb uns Controls
|
// segon només requereix afegir una altra entrada amb uns Controls
|
||||||
@@ -61,13 +77,13 @@ GameScene::GameScene()
|
|||||||
static_cast<float>(Map::playfield_y) + (static_cast<float>(Map::outer_corridor) / 2.0F);
|
static_cast<float>(Map::playfield_y) + (static_cast<float>(Map::outer_corridor) / 2.0F);
|
||||||
const auto SPAWN_X = CORRIDOR_CENTER_X - (static_cast<float>(Player::sprite_w) / 2.0F);
|
const auto SPAWN_X = CORRIDOR_CENTER_X - (static_cast<float>(Player::sprite_w) / 2.0F);
|
||||||
const auto SPAWN_Y = CORRIDOR_CENTER_Y - static_cast<float>(Player::collision_y_offset) - (static_cast<float>(Player::collision_size) / 2.0F);
|
const auto SPAWN_Y = CORRIDOR_CENTER_Y - static_cast<float>(Player::collision_y_offset) - (static_cast<float>(Player::collision_size) / 2.0F);
|
||||||
players_.emplace_back(std::make_unique<Player>(SPAWN_X, SPAWN_Y, CONTROLS_P1));
|
players_.emplace_back(std::make_unique<Player>(ANIM_KEY, SPAWN_X, SPAWN_Y, CONTROLS_P1));
|
||||||
|
|
||||||
// Música de fons de la piràmide 1 en bucle infinit. El track ja està al
|
// Música de fons en bucle infinit. El track ja està al Resource::Cache
|
||||||
// Resource::Cache (preload al Director), així que playMusic només mou el
|
// (preload al Director), així que playMusic només mou el punter cap a
|
||||||
// punter cap a jail_audio i obri l'stream.
|
// jail_audio i obri l'stream.
|
||||||
if (Audio::get() != nullptr) {
|
if (Audio::get() != nullptr) {
|
||||||
Audio::get()->playMusic("pyramid_1.ogg", -1);
|
Audio::get()->playMusic(config_.music_track, -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "core/scene/scene.hpp"
|
#include "core/scene/scene.hpp"
|
||||||
@@ -10,13 +11,26 @@ class Player;
|
|||||||
|
|
||||||
class GameScene : public Scene {
|
class GameScene : public Scene {
|
||||||
public:
|
public:
|
||||||
GameScene();
|
// Conjunt de rutes que defineixen una piràmide concreta (mapa + tilemap
|
||||||
|
// + sprites del jugador + música). Cada piràmide serà un Config distint;
|
||||||
|
// `defaultConfig()` retorna la primera (Defaults::Pyramid).
|
||||||
|
struct Config {
|
||||||
|
std::string map_yaml;
|
||||||
|
std::string player_sprite;
|
||||||
|
std::string player_yaml;
|
||||||
|
std::string music_track;
|
||||||
|
};
|
||||||
|
|
||||||
|
[[nodiscard]] static auto defaultConfig() -> Config;
|
||||||
|
|
||||||
|
explicit GameScene(Config config = defaultConfig());
|
||||||
~GameScene() override;
|
~GameScene() override;
|
||||||
|
|
||||||
void update(int delta_ms) override;
|
void update(int delta_ms) override;
|
||||||
void render() override;
|
void render() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Config config_;
|
||||||
Tilemap tilemap_;
|
Tilemap tilemap_;
|
||||||
|
|
||||||
// Vector des del principi: AEE suportarà multijugador local; cada Player
|
// Vector des del principi: AEE suportarà multijugador local; cada Player
|
||||||
|
|||||||
@@ -84,4 +84,14 @@ namespace Defaults {
|
|||||||
constexpr float SPEED_PX_PER_S = 60.0F; // Velocitat base del jugador (sense sprint / slow-zones).
|
constexpr float SPEED_PX_PER_S = 60.0F; // Velocitat base del jugador (sense sprint / slow-zones).
|
||||||
} // namespace Player
|
} // namespace Player
|
||||||
|
|
||||||
|
// Rutes d'assets per piràmide. Centralitzats ací perquè `GameScene` no
|
||||||
|
// en contingui cap literal; afegir una piràmide nova serà un altre
|
||||||
|
// conjunt de constants + un Config distint passat al ctor.
|
||||||
|
namespace Pyramid {
|
||||||
|
constexpr const char* MAP_YAML = "data/maps/pyramid.yaml";
|
||||||
|
constexpr const char* PLAYER_SPRITE = "data/player/player.gif";
|
||||||
|
constexpr const char* PLAYER_YAML = "data/player/player.yaml";
|
||||||
|
constexpr const char* MUSIC_TRACK = "pyramid_1.ogg";
|
||||||
|
} // namespace Pyramid
|
||||||
|
|
||||||
} // namespace Defaults
|
} // namespace Defaults
|
||||||
Reference in new issue
Block a user