Files
coffee-crisis/source/game/scenes/logo.cpp
T

134 lines
3.8 KiB
C++

#include "game/scenes/logo.h"
#include <SDL3/SDL.h>
#include <algorithm> // for min
#include <string> // 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
}