migrades portes i plataformes a solidActor

This commit is contained in:
2026-04-11 12:54:54 +02:00
parent 49f6ed41e6
commit 5b2f986d32
22 changed files with 686 additions and 286 deletions

View File

@@ -1,14 +1,26 @@
#include "platform_manager.hpp"
#include "game/entities/moving_platform.hpp" // Para MovingPlatform
#include "game/entities/moving_platform.hpp" // Para MovingPlatform
#include "game/gameplay/solid_actor_manager.hpp" // Para SolidActorManager
// Añade una plataforma a la colección
// Constructor: recibe el SolidActorManager para registrar las plataformas
// como SolidActors (flags CARRY_ON_TOP | ONEWAY_TOP) y que los sweeps del
// Player las detecten en moveVertical/checkFalling.
PlatformManager::PlatformManager(SolidActorManager* solid_actors)
: solid_actors_(solid_actors) {
}
// Añade una plataforma a la colección y la registra en el SolidActorManager
void PlatformManager::addPlatform(std::shared_ptr<MovingPlatform> platform) {
solid_actors_->registerActor(platform.get());
platforms_.push_back(std::move(platform));
}
// Elimina todas las plataformas
// Elimina todas las plataformas y las desregistra del SolidActorManager
void PlatformManager::clear() {
for (const auto& platform : platforms_) {
solid_actors_->unregisterActor(platform.get());
}
platforms_.clear();
}
@@ -57,40 +69,11 @@ auto PlatformManager::getPlatform(int index) -> std::shared_ptr<MovingPlatform>&
return platforms_.at(index);
}
// Elimina la última plataforma
// Elimina la última plataforma (y la desregistra del SolidActorManager)
void PlatformManager::removeLastPlatform() {
if (!platforms_.empty()) {
solid_actors_->unregisterActor(platforms_.back().get());
platforms_.pop_back();
}
}
#endif
// Comprueba si el jugador está sobre alguna plataforma
// Devuelve puntero a la plataforma o nullptr si no está sobre ninguna
auto PlatformManager::checkPlayerOnPlatform(const SDL_FRect& player_collider, float player_vy) -> MovingPlatform* {
// Solo detectamos si el jugador está cayendo o quieto (no saltando hacia arriba)
if (player_vy < 0.0F) {
return nullptr;
}
for (const auto& platform : platforms_) {
SDL_FRect plat_rect = platform->getCollider();
// Comprobar overlap horizontal
if (player_collider.x + player_collider.w <= plat_rect.x) { continue; }
if (player_collider.x >= plat_rect.x + plat_rect.w) { continue; }
// Comprobar que los pies del jugador están cerca del top de la plataforma
float player_feet = player_collider.y + player_collider.h;
float platform_top = plat_rect.y;
// Tolerancia bidireccional de 4px para compensar el movimiento entre frames
// (cuando la plataforma baja, los pies quedan por encima del top momentáneamente)
constexpr float TOLERANCE = 4.0F;
if (player_feet >= platform_top - TOLERANCE && player_feet <= platform_top + TOLERANCE) {
return platform.get();
}
}
return nullptr;
}