fix(player): facing del sprite des del desplaçament real, no de l'input
This commit is contained in:
1 parent
d26ecec04f
commit
de7233a012
1 file changed
+33
-5
@@ -330,15 +330,18 @@ void Player::updateFacingAndTurn(float delta_time, float vx, float vy) {
|
||||
intermediate_cardinal_ = intermediateFor(INPUT_CARD);
|
||||
turning_remaining_ms_ = static_cast<float>(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
|
||||
|
||||
Reference in new issue
Block a user