treballant en sistema de portes i claus

This commit is contained in:
2026-04-10 09:47:48 +02:00
parent 9aff4432df
commit 97c30bf9a1
37 changed files with 1236 additions and 110 deletions

View File

@@ -0,0 +1,65 @@
#include "game/entities/door.hpp"
#include "core/rendering/sprite/animated_sprite.hpp" // Para AnimatedSprite
#include "core/resources/resource_cache.hpp" // Para Resource
// 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").
Door::Door(const Data& data, bool start_opened)
: sprite_(std::make_shared<AnimatedSprite>(Resource::Cache::get()->getAnimationData(data.animation_path))),
id_(data.id),
state_(start_opened ? State::OPENED : State::CLOSED) {
sprite_->setPosX(data.x);
sprite_->setPosY(data.y);
sprite_->setCurrentAnimation(start_opened ? "opened" : "closed");
collider_ = sprite_->getRect();
}
// Pinta la puerta en pantalla
void Door::render() {
sprite_->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.
void Door::update(float delta_time) {
if (is_paused_) {
return;
}
if (state_ == State::OPENING) {
sprite_->animate(delta_time);
if (sprite_->animationIsCompleted()) {
state_ = State::OPENED;
sprite_->setCurrentAnimation("opened");
just_opened_ = true;
}
}
}
// Posición actual (para registrar el estado abierto en DoorTracker)
auto Door::getPos() const -> SDL_FPoint {
return SDL_FPoint{.x = sprite_->getX(), .y = sprite_->getY()};
}
// Transición CLOSED → OPENING: cambia el estado y arranca la animación de apertura
void Door::startOpening() {
if (state_ != State::CLOSED) {
return;
}
state_ = State::OPENING;
sprite_->setCurrentAnimation("opening");
sprite_->resetAnimation();
}
// Flag one-shot: devuelve true exactamente una vez después de transicionar a OPENED
auto Door::justOpened() -> bool {
if (just_opened_) {
just_opened_ = false;
return true;
}
return false;
}