From de7233a012fce453e9fc7a1694e0d6fe31d2cf79 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Fri, 1 May 2026 10:24:13 +0200 Subject: [PATCH] =?UTF-8?q?fix(player):=20facing=20del=20sprite=20des=20de?= =?UTF-8?q?l=20despla=C3=A7ament=20real,=20no=20de=20l'input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/game/entities/player.cpp | 38 ++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/source/game/entities/player.cpp b/source/game/entities/player.cpp index ec7c2d2..f1864f2 100644 --- a/source/game/entities/player.cpp +++ b/source/game/entities/player.cpp @@ -330,15 +330,18 @@ void Player::updateFacingAndTurn(float delta_time, float vx, float vy) { intermediate_cardinal_ = intermediateFor(INPUT_CARD); turning_remaining_ms_ = static_cast(turn_config.duration_ms); applyCardinal(intermediate_cardinal_); - } else if (vx != 0.0F) { - // Tria de facing: prevalença lateral, EAST/WEST segons el signe - // de vx; verticals purs van a NORTH/SOUTH. En aturar-se - // conservem `facing_` per a l'animació stand. - facing_ = (vx < 0.0F) ? Facing::WEST : Facing::EAST; } else if (vy < 0.0F) { + // Tria de facing amb prevalença vertical: si hi ha component + // vertical, el sprite mira NORTH/SOUTH encara que també hi + // haja horitzontal. Així una diagonal (down+right, up+left, + // etc.) mostra el sprite mirant amunt o avall, no de costat. + // Només quan el moviment és purament horitzontal anem a + // EAST/WEST. En aturar-se conservem `facing_` per a stand. facing_ = Facing::NORTH; } else if (vy > 0.0F) { facing_ = Facing::SOUTH; + } else if (vx != 0.0F) { + facing_ = (vx < 0.0F) ? Facing::WEST : Facing::EAST; } } @@ -1097,6 +1100,31 @@ void Player::applyMovement(float delta_time) { clampToPlayfield(); + // Refinem el `facing_` amb el desplaçament REAL del frame (post + // col·lisió/snap), no amb la velocitat d'entrada: si l'usuari prem + // diagonal en un pasillo, `tryMove` ja haurà anul·lat l'eix tapat + // per la paret, així que el sprite mira en la direcció realment + // efectuada (la d'input cru no ho sap). En AIRBORNE el facing es + // preserva des del despegue (vegeu el comentari de `integrateJump`), + // i durant un gir actiu el cardinal intermedi mana, així que els + // saltem. Si DX==DY==0 (parat o totalment bloquejat) preservem el + // facing previ per a l'animació stand. La prioritat vertical en + // diagonals lliures és intranscendent en pasillos (un dels dos eixos + // serà sempre 0); manté coherència amb la tria d'`updateFacingAndTurn`. + if (!AIRBORNE && turning_remaining_ms_ <= 0.0F) { + const float DX = getPosX() - FRAME_START_X; + const float DY = getPosY() - FRAME_START_Y; + if (DY < 0.0F) { + facing_ = Facing::NORTH; + } else if (DY > 0.0F) { + facing_ = Facing::SOUTH; + } else if (DX < 0.0F) { + facing_ = Facing::WEST; + } else if (DX > 0.0F) { + facing_ = Facing::EAST; + } + } + const bool MOVED = (getPosX() != FRAME_START_X) || (getPosY() != FRAME_START_Y); // `being_pushed_` força `stand_*`: el jugador es desplaça sense input, // animar-lo com a caminant faria creure que està caminant quan de