afinaments

This commit is contained in:
2026-04-11 19:05:29 +02:00
parent 72741896c1
commit c1764ba0d8
4 changed files with 28 additions and 11 deletions

View File

@@ -91,7 +91,11 @@ void SolidActorManager::forEachActor(Fn&& fn) const {
// Devuelve el borde derecho del actor bloqueante "a la izquierda" del Player.
// Criterio: el AABB del actor solapa el rect del Player y el borde izquierdo
// del actor está a la izquierda del borde izquierdo del Player (el Player se
// mete en él por la izquierda).
// mete en él por la izquierda). El test del borde derecho es contact-inclusive
// (>=) para que el contacto flush cuente como pared, igual que TileCollider.
// Sin esto, Player::stuckAgainstWall no detectaba puertas cerradas en contacto
// y la animación "walk" se reproducía aunque el clamp de moveHorizontal
// dejase x_ inmóvil.
auto SolidActorManager::checkWallLeft(float px, float py, float pw, float ph) const -> float {
float result = Collision::NONE;
forEachActor([&](const SolidActor* a, const SDL_FRect& r) {
@@ -100,9 +104,10 @@ auto SolidActorManager::checkWallLeft(float px, float py, float pw, float ph) co
// Y-overlap
if (py + ph <= r.y) { return; }
if (py >= r.y + r.h) { return; }
// X-overlap y "a la izquierda": el Player (px) está dentro del actor.
// X-overlap y "a la izquierda": el Player (px) está dentro del actor
// o en contacto exacto con su borde derecho.
const float RIGHT_EDGE = r.x + r.w;
if (r.x < px && RIGHT_EDGE > px) {
if (r.x < px && RIGHT_EDGE >= px) {
if (result == Collision::NONE || RIGHT_EDGE > result) {
result = RIGHT_EDGE;
}
@@ -112,6 +117,7 @@ auto SolidActorManager::checkWallLeft(float px, float py, float pw, float ph) co
}
// Devuelve el borde izquierdo del actor bloqueante "a la derecha" del Player.
// Test contact-inclusive (<=) por las mismas razones que checkWallLeft.
auto SolidActorManager::checkWallRight(float px, float py, float pw, float ph) const -> float {
float result = Collision::NONE;
forEachActor([&](const SolidActor* a, const SDL_FRect& r) {
@@ -120,9 +126,10 @@ auto SolidActorManager::checkWallRight(float px, float py, float pw, float ph) c
// Y-overlap
if (py + ph <= r.y) { return; }
if (py >= r.y + r.h) { return; }
// X-overlap y "a la derecha": el borde derecho del Player entra en el actor.
// X-overlap y "a la derecha": el borde derecho del Player entra en el
// actor o está en contacto exacto con su borde izquierdo.
const float PLAYER_RIGHT = px + pw;
if (r.x < PLAYER_RIGHT && r.x + r.w > PLAYER_RIGHT) {
if (r.x <= PLAYER_RIGHT && r.x + r.w > PLAYER_RIGHT) {
if (result == Collision::NONE || r.x < result) {
result = r.x;
}