feat(collisions): filtre per altura — saltar esquiva momies, roques i altres jugadors
This commit is contained in:
1 parent
7b09a076b2
commit
cd50626b88
11 files changed
+88
-1
No files matched your search
@@ -300,9 +300,18 @@ auto Player::collidesWithWorld(const SDL_FRect& box) const -> bool {
|
||||
// amb la hit-box actual de l'altre jugador. Així la caixa de moviment
|
||||
// (16×16) segueix topant amb murs/sarcs però els jugadors poden
|
||||
// acostar-se fins al contacte real.
|
||||
//
|
||||
// Filtre per altura: si aquest jugador (this) està en l'aire i passa
|
||||
// per damunt del cos de l'altre, no hi ha col·lisió — saltar permet
|
||||
// sobrevolar l'altre. `body_height` és estàtic (compartit entre
|
||||
// jugadors), però per al filtre val la pena consultar-lo per actor
|
||||
// perquè en el futur cada character podria tenir-ne un de propi.
|
||||
const SDL_FRect PROPOSED_HIT = hitBoxFromBase(box);
|
||||
return std::ranges::any_of(*all_players_, [this, &PROPOSED_HIT](const Player* p) {
|
||||
const float Z = jump_z_;
|
||||
const bool AIRBORNE = (state_ == State::AIRBORNE);
|
||||
return std::ranges::any_of(*all_players_, [this, &PROPOSED_HIT, AIRBORNE, Z](const Player* p) {
|
||||
if (p == nullptr || p == this) { return false; }
|
||||
if (AIRBORNE && body_height > 0 && Z > static_cast<float>(body_height)) { return false; }
|
||||
const auto OTHER = p->getHitBox();
|
||||
return SDL_HasRectIntersectionFloat(&PROPOSED_HIT, &OTHER);
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user