#include "game/scenes/logo.h" #include #include // for min #include // for basic_string #include "core/audio/audio.hpp" // for Audio::get, Audio::update #include "core/input/global_inputs.hpp" // for GlobalInputs::handle #include "core/input/input.h" // for Input, Input::Repeat::OFF, InputAction #include "core/rendering/screen.h" // for Screen #include "core/rendering/sprite.h" // for Sprite #include "core/resources/resource.h" #include "game/defaults.hpp" // for bgColor, SECTION_PROG_LOGO, SECTION_PROG... #include "utils/utils.h" // for Section, Color // Valores de inicialización y fin constexpr int INIT_FADE = 100; constexpr int END_LOGO = 200; // Constructor Logo::Logo(SDL_Renderer *renderer, Section *section) { // Copia la dirección de los objetos this->renderer_ = renderer; this->section_ = section; // Reserva memoria para los punteros event_handler_ = new SDL_Event(); texture_ = Resource::get()->getTexture("logo.png"); sprite_ = new Sprite(14, 75, 226, 44, texture_, renderer); // Inicializa variables counter_ = 0; section->name = SECTION_PROG_LOGO; section->subsection = 0; ticks_ = 0; ticks_speed_ = 15; Audio::get()->stopMusic(); } // Destructor Logo::~Logo() { // texture es propiedad de Resource — no liberar aquí. delete sprite_; delete event_handler_; } // Comprueba si ha terminado el logo void Logo::checkLogoEnd() { if (counter_ >= END_LOGO + 20) { section_->name = SECTION_PROG_INTRO; section_->subsection = 0; } } // Comprueba las entradas void Logo::checkInput() { // ESC (Action::EXIT) ja el gestiona GlobalInputs::handle() amb doble // pulsació; el quit es propaga via Director::iterate. if (GlobalInputs::handle()) { return; } if (Input::get()->checkInput(Input::Action::PAUSE, Input::Repeat::OFF) || Input::get()->checkInput(Input::Action::ACCEPT, Input::Repeat::OFF) || Input::get()->checkInput(Input::Action::FIRE_LEFT, Input::Repeat::OFF) || Input::get()->checkInput(Input::Action::FIRE_CENTER, Input::Repeat::OFF) || Input::get()->checkInput(Input::Action::FIRE_RIGHT, Input::Repeat::OFF)) { section_->name = SECTION_PROG_TITLE; section_->subsection = SUBSECTION_TITLE_1; } } // Dibuja el fade void Logo::renderFade() { // Dibuja el fade if (counter_ >= INIT_FADE) { const float STEP = (float)(counter_ - INIT_FADE) / (float)(END_LOGO - INIT_FADE); const int ALPHA = std::min((int)(255 * STEP), 255); SDL_SetRenderDrawColor(renderer_, BG_COLOR.r, BG_COLOR.g, BG_COLOR.b, ALPHA); SDL_RenderFillRect(renderer_, nullptr); } } // Actualiza las variables del objeto void Logo::update() { Audio::update(); checkInput(); if (SDL_GetTicks() - ticks_ > ticks_speed_) { // Actualiza el contador de ticks ticks_ = SDL_GetTicks(); // Actualiza el contador counter_++; // Comprueba si ha terminado el logo checkLogoEnd(); } } // Dibuja el objeto en pantalla void Logo::render() { // Prepara para empezar a dibujar en la textura de juego Screen::get()->start(); // Limpia la pantalla Screen::get()->clean({238, 238, 238}); // Dibuja los objetos sprite_->render(); // Dibuja el fade renderFade(); // Vuelca el contenido del renderizador en pantalla Screen::get()->blit(); } // Bucle para el logo del juego void Logo::run() { Audio::get()->stopMusic(); while (section_->name == SECTION_PROG_LOGO) { iterate(); } } // Ejecuta un frame void Logo::iterate() { update(); render(); } // Procesa un evento individual void Logo::handleEvent(const SDL_Event *event) { // SDL_EVENT_QUIT ya lo maneja Director }