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);
|
intermediate_cardinal_ = intermediateFor(INPUT_CARD);
|
||||||
turning_remaining_ms_ = static_cast<float>(turn_config.duration_ms);
|
turning_remaining_ms_ = static_cast<float>(turn_config.duration_ms);
|
||||||
applyCardinal(intermediate_cardinal_);
|
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) {
|
} 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;
|
facing_ = Facing::NORTH;
|
||||||
} else if (vy > 0.0F) {
|
} else if (vy > 0.0F) {
|
||||||
facing_ = Facing::SOUTH;
|
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();
|
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);
|
const bool MOVED = (getPosX() != FRAME_START_X) || (getPosY() != FRAME_START_Y);
|
||||||
// `being_pushed_` força `stand_*`: el jugador es desplaça sense input,
|
// `being_pushed_` força `stand_*`: el jugador es desplaça sense input,
|
||||||
// animar-lo com a caminant faria creure que està caminant quan de
|
// animar-lo com a caminant faria creure que està caminant quan de
|
||||||
|
|||||||
Reference in new issue
Block a user