fix(player): el jugador empentat es queda en stand, no walk

This commit is contained in:
JailDesigner committed 2026-04-24 19:00:04 +02:00
1 parent e22f3240da
commit 511f8d5b09
3 files changed
+25 -1

No files matched your search

+9 -1
View File
@@ -256,6 +256,11 @@ auto Player::collidesWithWorld(const SDL_FRect& box) const -> bool {
} }
void Player::tick(float delta_time) { void Player::tick(float delta_time) {
// Reset per frame: el resolver del GameScene el tornarà a posar a
// true si aquest frame hi ha push actiu. Així quan el push acaba
// (un deixa d'empentar, l'altre comença a caminar), l'animació torna
// a governar-se per la velocitat real sense estat romanent.
being_pushed_ = false;
// Via `InputState` en lloc de `SDL_GetKeyboardState` directe: quan el // Via `InputState` en lloc de `SDL_GetKeyboardState` directe: quan el
// service menu (o qualsevol UI modal) està obert, el wrapper retorna // service menu (o qualsevol UI modal) està obert, el wrapper retorna
// un buffer tot-a-zero perquè el jugador no es mogui mentre l'usuari // un buffer tot-a-zero perquè el jugador no es mogui mentre l'usuari
@@ -318,7 +323,10 @@ void Player::applyMovement(float delta_time) {
clampToPlayfield(); clampToPlayfield();
const bool MOVED = (getPosX() != FRAME_START_X) || (getPosY() != FRAME_START_Y); const bool MOVED = (getPosX() != FRAME_START_X) || (getPosY() != FRAME_START_Y);
const bool ANIM_AS_MOVING = MOVED && (turning_remaining_ms_ <= 0.0F); // `being_pushed_` força `stand_*`: el jugador es desplaça sense input,
// animar-lo com a caminant faria creure que està caminant quan de
// fet és arrossegat per l'altre.
const bool ANIM_AS_MOVING = MOVED && (turning_remaining_ms_ <= 0.0F) && !being_pushed_;
setCurrentAnimation(animationName(ANIM_AS_MOVING)); setCurrentAnimation(animationName(ANIM_AS_MOVING));
// Detecció de canvi de tile. Es calcula *després* del clamp i de les // Detecció de canvi de tile. Es calcula *després* del clamp i de les
+13
View File
@@ -87,6 +87,14 @@ class Player : public AnimatedSprite {
// contra mur) s'emparen automàticament. // contra mur) s'emparen automàticament.
void setOtherPlayers(const std::vector<Player*>* all) { all_players_ = all; } void setOtherPlayers(const std::vector<Player*>* all) { all_players_ = all; }
// Marcat pel resolver jugador↔jugador quan aquest frame el jugador
// és arrossegat per una empenta (no té input propi; es desplaça
// perquè l'altre l'empeny). Determina que l'animació del frame siga
// `stand_*` encara que la posició canvie. El flag es reseteja a
// l'inici de cada `tick`, així que el resolver l'ha de tornar a
// posar cada frame que el push s'haja de mantenir.
void setBeingPushed(bool pushed) { being_pushed_ = pushed; }
// Y de la base del jugador (cara inferior de la caixa de colisió). Usada // Y de la base del jugador (cara inferior de la caixa de colisió). Usada
// per al Z-order contra els sarcs: peus per sobre d'un sarc → darrere; // per al Z-order contra els sarcs: peus per sobre d'un sarc → darrere;
// per sota → davant. // per sota → davant.
@@ -162,6 +170,11 @@ class Player : public AnimatedSprite {
// Punter a la llista de tots els jugadors del nivell (propietat del // Punter a la llista de tots els jugadors del nivell (propietat del
// GameScene). `nullptr` = jugador aïllat, sense col·lisió inter-P. // GameScene). `nullptr` = jugador aïllat, sense col·lisió inter-P.
const std::vector<Player*>* all_players_{nullptr}; const std::vector<Player*>* all_players_{nullptr};
// Frame actual el jugador està sent empentat (no té input propi).
// Serveix només per a l'elecció d'animació — la posició ja la
// gestiona `intended_vx_/vy_` escalats pel resolver.
bool being_pushed_{false};
// Còpia plana de la geometria del mapa + punters a `collides`/ // Còpia plana de la geometria del mapa + punters a `collides`/
// `inside_playfield`. POD trivial; copiada al ctor i no muta durant // `inside_playfield`. POD trivial; copiada al ctor i no muta durant
// la vida del Player. Vol dir que aquest Player només és vàlid per // la vida del Player. Vol dir que aquest Player només és vàlid per
+3
View File
@@ -130,6 +130,9 @@ namespace {
const float VY = pusher->getIntendedVY() * push_factor; const float VY = pusher->getIntendedVY() * push_factor;
pusher->setIntendedVelocity(VX, VY); pusher->setIntendedVelocity(VX, VY);
pushed->setIntendedVelocity(VX, VY); pushed->setIntendedVelocity(VX, VY);
// El pushed es mourà sense input propi: marquem-ho perquè
// `applyMovement` no active la variant `walk` de l'animació.
pushed->setBeingPushed(true);
} }
// Ordre d'`applyMovement`: en push, el pushed ha de moure's abans // Ordre d'`applyMovement`: en push, el pushed ha de moure's abans