feat(collisions): filtre per altura — saltar esquiva momies, roques i altres jugadors

This commit is contained in:
JailDesigner committed 2026-04-25 11:49:48 +02:00
1 parent 7b09a076b2
commit cd50626b88
11 files changed
+88 -1

No files matched your search

+10 -1
View File
@@ -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);
});