From 67ecb704d2501974d73ace48336fedec0fff5ee0 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 23 Apr 2026 17:33:47 +0200 Subject: [PATCH] =?UTF-8?q?feat(pyramid):=20usa=20variants=2016=C3=9732=20?= =?UTF-8?q?sam=20(jugador)=20i=20momia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/entities/momia/momia.gif | Bin 0 -> 1207 bytes data/entities/momia/momia.yaml | 35 ++++++++++++++++++++++ data/maps/pyramid.yaml | 4 +-- data/player/sam.gif | Bin 0 -> 1516 bytes data/player/sam.yaml | 37 ++++++++++++++++++++++++ source/game/entities/concrete/mummy.cpp | 1 + source/game/entities/entity_factory.hpp | 35 ++++++++++++---------- source/utils/defaults.hpp | 4 +-- 8 files changed, 97 insertions(+), 19 deletions(-) create mode 100644 data/entities/momia/momia.gif create mode 100644 data/entities/momia/momia.yaml create mode 100644 data/player/sam.gif create mode 100644 data/player/sam.yaml diff --git a/data/entities/momia/momia.gif b/data/entities/momia/momia.gif new file mode 100644 index 0000000000000000000000000000000000000000..9352a9688e68beb38eaee257ad0197571f526203 GIT binary patch literal 1207 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 SDae$Ct0m=j$xF&b002As)4kFF literal 0 HcmV?d00001 diff --git a/data/player/sam.yaml b/data/player/sam.yaml new file mode 100644 index 0000000..83017bf --- /dev/null +++ b/data/player/sam.yaml @@ -0,0 +1,37 @@ +# player animation +tileSetFile: sam.gif +frameWidth: 16 +frameHeight: 32 + +# Geometria de col·lisió del jugador (independent de l'animació): +# size → costat del quadrat de col·lisió (16×16) +# base_size → costat del quadrat visual inferior del sprite (els "peus"); +# s'usa per centrar la caixa de col·lisió sobre ell. +collision: + size: 16 + base_size: 16 + +animations: + - name: stand_down + frames: [1] + + - name: stand_up + frames: [5] + + - name: stand + frames: [9] + + - name: walk_down + speed: 0.1 + loopFrom: 0 + frames: [0, 1, 2, 3] + + - name: walk_up + speed: 0.1 + loopFrom: 0 + frames: [4, 5, 6, 7] + + - name: walk + speed: 0.1 + loopFrom: 0 + frames: [8, 9, 10, 11] diff --git a/source/game/entities/concrete/mummy.cpp b/source/game/entities/concrete/mummy.cpp index 08a056c..63f83c0 100644 --- a/source/game/entities/concrete/mummy.cpp +++ b/source/game/entities/concrete/mummy.cpp @@ -299,3 +299,4 @@ void Mummy::onPlayerContact(Player* /*player*/) { } REGISTER_ENTITY("mummy", Mummy) +REGISTER_ENTITY_AS("momia", Mummy, Momia) diff --git a/source/game/entities/entity_factory.hpp b/source/game/entities/entity_factory.hpp index 601d195..4fba022 100644 --- a/source/game/entities/entity_factory.hpp +++ b/source/game/entities/entity_factory.hpp @@ -43,23 +43,28 @@ class EntityFactory { }; // La macro genera un objecte anònim dins un namespace anònim: el seu -// constructor s'executa abans de `main` i registra la factory. El nom del -// símbol és únic per `CLASS` perquè el preprocessor el concatena; així -// dues entitats diferents no xoquen. +// constructor s'executa abans de `main` i registra la factory. El nom +// del símbol es compon amb `TAG`, perquè així es poden registrar àlies +// per una mateixa classe (p.ex. "mummy" i "momia" → Mummy) sense que +// els símbols xoquen. La forma curta `REGISTER_ENTITY(NAME, CLASS)` +// reusa `CLASS` com a tag; per àlies cal usar `REGISTER_ENTITY_AS` i +// passar un identificador únic. // // IMPORTANT: perquè el registrador es cridi, el `.cpp` que el conté ha // d'estar enllaçat directament a l'executable (no dins una STATIC lib // sense `--whole-archive`). Tots els `concrete/*.cpp` entren a APP_SOURCES. -#define REGISTER_ENTITY(NAME, CLASS) \ - namespace { \ - struct CLASS##_Registrar { \ - CLASS##_Registrar() { \ - EntityFactory::instance().registerCreator( \ - NAME, \ - [](const fkyaml::node& yaml) -> std::unique_ptr { \ - return std::make_unique(yaml); \ - }); \ - } \ - }; \ - const CLASS##_Registrar g_##CLASS##_registrar; /* NOLINT(cert-err58-cpp) */ \ +#define REGISTER_ENTITY_AS(NAME, CLASS, TAG) \ + namespace { \ + struct TAG##_Registrar { \ + TAG##_Registrar() { \ + EntityFactory::instance().registerCreator( \ + NAME, \ + [](const fkyaml::node& yaml) -> std::unique_ptr { \ + return std::make_unique(yaml); \ + }); \ + } \ + }; \ + const TAG##_Registrar g_##TAG##_registrar; /* NOLINT(cert-err58-cpp) */ \ } + +#define REGISTER_ENTITY(NAME, CLASS) REGISTER_ENTITY_AS(NAME, CLASS, CLASS) diff --git a/source/utils/defaults.hpp b/source/utils/defaults.hpp index f906fca..bcbb859 100644 --- a/source/utils/defaults.hpp +++ b/source/utils/defaults.hpp @@ -181,8 +181,8 @@ namespace Defaults { // 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* PLAYER_SPRITE = "data/player/sam.gif"; + constexpr const char* PLAYER_YAML = "data/player/sam.yaml"; constexpr const char* MUSIC_TRACK = "pyramid_1.ogg"; } // namespace Pyramid