migrades portes i plataformes a solidActor
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user