feat(player): estat ATTACKING amb edge-detect, animacions i spawn del whip via bus
This commit is contained in:
1 parent
5db3bb0bd0
commit
d208ba02df
7 files changed
+288
-1
No files matched your search
@@ -24,6 +24,7 @@ class Player : public AnimatedSprite {
|
||||
SDL_Scancode left;
|
||||
SDL_Scancode right;
|
||||
SDL_Scancode jump;
|
||||
SDL_Scancode attack;
|
||||
};
|
||||
|
||||
// Estat d'alt nivell del jugador. Ortogonal a `Facing`/`Cardinal`
|
||||
@@ -44,6 +45,15 @@ class Player : public AnimatedSprite {
|
||||
AIRBORNE,
|
||||
LANDING_STUN,
|
||||
HURT,
|
||||
// Atacant amb látigo. Estat mútuament exclusiu amb AIRBORNE: no
|
||||
// es pot atacar saltant, ni saltar atacant. Cobreix swing +
|
||||
// cooldown internament: durant `whip_swing_ms` es spawneja
|
||||
// l'entitat WhipAttack i corre l'animació `attack_*`; durant
|
||||
// `whip_cooldown_ms` posterior, el jugador segueix bloquejat
|
||||
// (no input, no salt, no atac) però visualment torna a
|
||||
// `stand_*`. En total, ATTACKING dura `swing_ms + cooldown_ms`;
|
||||
// en acabar, torna a GROUNDED.
|
||||
ATTACKING,
|
||||
// Jugador que ha eixit per la porta de la sala. Despawn lògic:
|
||||
// no es renderitza, no processa input, no es mou, no col·lisiona
|
||||
// amb res ni rep contacte d'entitats. Idempotent: les crides
|
||||
@@ -503,6 +513,37 @@ class Player : public AnimatedSprite {
|
||||
// Llig el bloc `hurt:` del YAML i n'omple `hurt_config`.
|
||||
static void readHurtBlock(const fkyaml::node& yaml);
|
||||
|
||||
// Configuració del látigo del jugador llegida del bloc `whip:` del
|
||||
// YAML. `range_tiles` defineix la longitud de la hitbox abans de
|
||||
// retallar; `swing_ms` és la durada de l'animació d'atac (des
|
||||
// d'`enterAttacking` fins a desbloquejar el cooldown); `cooldown_ms`
|
||||
// afegeix una fase posterior durant la qual el jugador segueix
|
||||
// bloquejat però la hitbox ja no fa dany. `damage` queda llegit per
|
||||
// a futur; per ara els objectius reben sempre `enterHurt`.
|
||||
struct WhipConfig {
|
||||
float range_tiles{0.0F};
|
||||
int swing_ms{0};
|
||||
int cooldown_ms{0};
|
||||
int damage{0};
|
||||
};
|
||||
static WhipConfig whip_config;
|
||||
|
||||
// Llig el bloc `whip:` del YAML i n'omple `whip_config`. Si manca el
|
||||
// bloc, els camps queden a 0 i el jugador no pot atacar (el flanc
|
||||
// d'input es perd silenciosament).
|
||||
static void readWhipBlock(const fkyaml::node& yaml);
|
||||
|
||||
// Activa l'estat ATTACKING en la direcció cardinal indicada (la
|
||||
// direcció cap on mira el jugador) i publica `whip_spawn` al bus
|
||||
// perquè el GameScene cree el `WhipAttack` corresponent. Posa el
|
||||
// timer `attacking_remaining_ms_` a `swing_ms + cooldown_ms`.
|
||||
void enterAttacking(Cardinal facing);
|
||||
|
||||
// Cardinal que correspon al `(facing_, flip_)` actual del sprite —
|
||||
// la direcció cap on mira el jugador. Si `facing_ == SIDE` el
|
||||
// resultat depèn del flip; UP/DOWN són trivials. Mai retorna NONE.
|
||||
[[nodiscard]] auto currentFacingCardinal() const -> Cardinal;
|
||||
|
||||
// Activa l'estat HURT: el jugador queda projectat amb velocitat
|
||||
// inicial `hurt_config.initial_speed_px_per_s`. La direcció es tria
|
||||
// així:
|
||||
@@ -549,10 +590,24 @@ class Player : public AnimatedSprite {
|
||||
bool jump_held_keyboard_{false};
|
||||
bool jump_held_gamepad_{false};
|
||||
|
||||
// Mateixa idea per al botó d'atac: edge-detection independent
|
||||
// teclat/mando, perquè mantenir la tecla no genere atacs en cadena.
|
||||
bool attack_held_keyboard_{false};
|
||||
bool attack_held_gamepad_{false};
|
||||
|
||||
// Temps que queda dins de l'estat ATTACKING (swing + cooldown). Quan
|
||||
// arriba a 0, transició a GROUNDED. Mentre dura, el jugador queda
|
||||
// bloquejat i no rep input direccional ni de salt ni d'atac.
|
||||
float attacking_remaining_ms_{0.0F};
|
||||
|
||||
// Llig el botó de salt aquest frame (teclat + mando assignat) i,
|
||||
// amb edge-detection, retorna true si s'ha de despegar el salt.
|
||||
[[nodiscard]] auto consumeJumpEdge() -> bool;
|
||||
|
||||
// Anàleg per a l'atac: edge-detection del botó d'atac (teclat
|
||||
// `controls_.attack` + `SDL_GAMEPAD_BUTTON_WEST`).
|
||||
[[nodiscard]] auto consumeAttackEdge() -> bool;
|
||||
|
||||
// Inicia un salt: copia `intended_v*` com a velocitat fixada del salt,
|
||||
// posa `jump_vz_ = impulse`, transiciona a AIRBORNE.
|
||||
void startJump();
|
||||
|
||||
Reference in new issue
Block a user