fix(player): snapToLane respecta col·lisió PvP i empeny amb push_factor
This commit is contained in:
1 parent
1af43ef052
commit
4f1a3260a5
3 files changed
+108
-5
No files matched your search
@@ -117,6 +117,14 @@ class Player : public AnimatedSprite {
|
||||
// posar cada frame que el push s'haja de mantenir.
|
||||
void setBeingPushed(bool pushed) { being_pushed_ = pushed; }
|
||||
|
||||
// Factor d'escala d'empenta jugador↔jugador (viu al YAML del mapa).
|
||||
// L'usa el resolver de GameScene per al push horitzontal, i també
|
||||
// `snapToLane` quan descobreix que un altre jugador li bloqueja el
|
||||
// carril objectiu: per coherència, la pushada del snap va al mateix
|
||||
// ritme que l'horitzontal. Si no es crida, el valor per defecte 1.0
|
||||
// manté el snap a velocitat plena (comportament pre-multiplayer).
|
||||
void setPushFactor(float factor) { push_factor_ = factor; }
|
||||
|
||||
// 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 sota → davant.
|
||||
@@ -191,6 +199,18 @@ class Player : public AnimatedSprite {
|
||||
float (Player::*get_pos)() const,
|
||||
void (Player::*set_pos)(float));
|
||||
|
||||
// Quan el snap lateral trobaria un altre jugador al carril objectiu,
|
||||
// l'empentem el mateix step en el mateix eix. Així `this` pot entrar
|
||||
// al passadís encara que l'altre estiga estacionat al mitj — mateix
|
||||
// contracte que el push horitzontal però disparat pel snap. Retorna
|
||||
// true si la push ha quedat neta (ningú xoca amb el mapa ni amb un
|
||||
// tercer jugador); false fa que el caller revertisca el propi snap.
|
||||
// Marca els blockers amb `being_pushed_` per a la seua animació.
|
||||
auto tryPushSnapBlockers(
|
||||
float signed_step,
|
||||
float (Player::*get_pos)() const,
|
||||
void (Player::*set_pos)(float)) -> bool;
|
||||
|
||||
int id_{-1};
|
||||
Controls controls_;
|
||||
|
||||
@@ -225,6 +245,11 @@ class Player : public AnimatedSprite {
|
||||
// Serveix només per a l'elecció d'animació — la posició ja la
|
||||
// gestiona `intended_vx_/vy_` escalats pel resolver.
|
||||
bool being_pushed_{false};
|
||||
|
||||
// Escala d'empenta usada per `snapToLane` quan descobreix un blocker
|
||||
// (mateixa del resolver). 1.0 = sense escalar (comportament si
|
||||
// GameScene no ha cridat setPushFactor).
|
||||
float push_factor_{1.0F};
|
||||
// Còpia plana de la geometria del mapa + punters a `collides`/
|
||||
// `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
|
||||
|
||||
Reference in new issue
Block a user