feat(pyramid): usa variants 16×32 sam (jugador) i momia
This commit is contained in:
1 parent
936adf1405
commit
67ecb704d2
8 files changed
+97
-19
No files matched your search
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
@@ -0,0 +1,35 @@
|
||||
name: momia
|
||||
type: dynamic_hazard
|
||||
sprite:
|
||||
path: momia.gif
|
||||
size: [16, 32]
|
||||
tile_size: [1, 1]
|
||||
# Variant 16×32 de la momia: el sprite fa 16×32 (dos 16×16: cap i peus)
|
||||
# i la caja de col·lisió amb el mapa és 16×16, coincident amb el
|
||||
# rectangle-base 16×16 dels peus. Com que `size` i `base_size` són
|
||||
# iguals, el padding és zero i la caja s'alinea exactament amb la
|
||||
# silueta inferior del sprite; amb `anchor: feet` ocupa la cel·la
|
||||
# 16×16 del corredor on naix.
|
||||
anchor: feet
|
||||
collision:
|
||||
size: [16, 16]
|
||||
base_size: [16, 16]
|
||||
flags:
|
||||
collides: true
|
||||
interactable: false
|
||||
# Strip de 12 frames en graella 4×3 (mateix esquema que el jugador):
|
||||
# 0..3 → walk_down (cara avall)
|
||||
# 4..7 → walk_up (cara amunt)
|
||||
# 8..11 → walk (lateral; flip horitzontal segons el sentit)
|
||||
# La momia no té variants `stand_*` perquè mai no para.
|
||||
animations:
|
||||
walk_down: { frames: [0, 1, 2, 3], fps: 8, loop: true }
|
||||
walk_up: { frames: [4, 5, 6, 7], fps: 8, loop: true }
|
||||
walk: { frames: [8, 9, 10, 11], fps: 8, loop: true }
|
||||
ai:
|
||||
type: corridor_wanderer
|
||||
direction_choice: random
|
||||
initial_direction: right
|
||||
stats:
|
||||
speed: 30
|
||||
damage: 1
|
||||
@@ -118,7 +118,7 @@ entities:
|
||||
sarc_position: [3, 4]
|
||||
- type: door
|
||||
position: [9, 1]
|
||||
- type: mummy
|
||||
- type: momia
|
||||
position: [10, 7]
|
||||
- type: mummy
|
||||
- type: momia
|
||||
position: [7, 9]
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.5 KiB |
@@ -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]
|
||||
@@ -299,3 +299,4 @@ void Mummy::onPlayerContact(Player* /*player*/) {
|
||||
}
|
||||
|
||||
REGISTER_ENTITY("mummy", Mummy)
|
||||
REGISTER_ENTITY_AS("momia", Mummy, Momia)
|
||||
@@ -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<Entity> { \
|
||||
return std::make_unique<CLASS>(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<Entity> { \
|
||||
return std::make_unique<CLASS>(yaml); \
|
||||
}); \
|
||||
} \
|
||||
}; \
|
||||
const TAG##_Registrar g_##TAG##_registrar; /* NOLINT(cert-err58-cpp) */ \
|
||||
}
|
||||
|
||||
#define REGISTER_ENTITY(NAME, CLASS) REGISTER_ENTITY_AS(NAME, CLASS, CLASS)
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in new issue
Block a user