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

@@ -5,7 +5,9 @@
// Constructor: carga la animación y posiciona la puerta. Si start_opened es
// true, la puerta se crea ya abierta (estado OPENED, animación "opened"); en
// caso contrario, se crea cerrada (estado CLOSED, animación "closed").
// caso contrario, se crea cerrada (estado CLOSED, animación "closed") y
// activa el flag BLOCKS_PLAYER del SolidActor para que los sweeps del
// SolidActorManager la vean como muro.
Door::Door(const Data& data, bool start_opened)
: sprite_(std::make_shared<AnimatedSprite>(Resource::Cache::get()->getAnimationData(data.animation_path))),
id_(data.id),
@@ -13,7 +15,10 @@ Door::Door(const Data& data, bool start_opened)
sprite_->setPosX(data.x);
sprite_->setPosY(data.y);
sprite_->setCurrentAnimation(start_opened ? "opened" : "closed");
collider_ = sprite_->getRect();
aabb_ = sprite_->getRect();
if (!start_opened) {
flags_ = BLOCKS_PLAYER;
}
}
// Pinta la puerta en pantalla
@@ -23,8 +28,9 @@ void Door::render() {
// Avanza la animación. Solo OPENING anima de verdad; CLOSED y OPENED son
// frames estáticos. Cuando la animación de OPENING termina, transiciona a
// OPENED, fija el frame final y marca just_opened_ para que el DoorManager
// libere los tiles de colisión.
// OPENED, fija el frame final, limpia el flag BLOCKS_PLAYER (los sweeps
// del SolidActorManager dejan de verla como muro) y marca just_opened_
// para que el DoorManager persista el estado abierto en DoorTracker.
void Door::update(float delta_time) {
if (is_paused_) {
return;
@@ -35,6 +41,7 @@ void Door::update(float delta_time) {
if (sprite_->animationIsCompleted()) {
state_ = State::OPENED;
sprite_->setCurrentAnimation("opened");
flags_ = 0; // Deja de bloquear al Player
just_opened_ = true;
}
}
@@ -65,11 +72,12 @@ auto Door::justOpened() -> bool {
}
#ifdef _DEBUG
// Mueve la puerta a la posición indicada (sprite + collider). NO toca el
// CollisionMap — eso es responsabilidad del DoorManager (moveDoor/removeDoor).
// Mueve la puerta a la posición indicada (sprite + AABB del SolidActor).
// Usado por el editor; el DoorManager::moveDoor se encarga del bookkeeping
// de registro en el SolidActorManager.
void Door::setPosition(float x, float y) {
sprite_->setPosX(x);
sprite_->setPosY(y);
collider_ = sprite_->getRect();
aabb_ = sprite_->getRect();
}
#endif