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