#include "logo.h" #include // for SDL_PollEvent, SDL_Event #include // for SDL_GetTicks #include // for basic_string, string #include "asset.h" // for Asset #include "global_events.h" // for check #include "global_inputs.h" // for check #include "input.h" // for Input #include "jail_audio.h" // for JA_StopMusic #include "options.h" // for Options, options, SectionState, Section #include "resource.h" // for Resource #include "screen.h" // for Screen #include "sprite.h" // for Sprite #include "texture.h" // for Texture #include "utils.h" // for Color, stringToColor #include "defines.h" // Constructor Logo::Logo() : screen_(Screen::get()), renderer_(Screen::get()->getRenderer()), resource_(Resource::get()), asset_(Asset::get()), input_(Input::get()) { // Reserva memoria para los punteros jailgames_texture_ = resource_->getTexture("jailgames.png"); since_1998_texture_ = resource_->getTexture("since_1998.png"); since_1998_sprite_ = std::make_shared(since_1998_texture_, (256 - since_1998_texture_->getWidth()) / 2, 83 + jailgames_texture_->getHeight() + 5, since_1998_texture_->getWidth(), since_1998_texture_->getHeight()); since_1998_sprite_->setClip(0, 0, since_1998_texture_->getWidth(), since_1998_texture_->getHeight()); since_1998_texture_->setColor(0, 0, 0); // Crea los sprites de cada linea for (int i = 0; i < jailgames_texture_->getHeight(); ++i) { jailgames_sprite_.push_back(std::make_shared(jailgames_texture_, 0, i, jailgames_texture_->getWidth(), 1)); jailgames_sprite_.back()->setClip(0, i, jailgames_texture_->getWidth(), 1); if (i % 2 == 0) { jailgames_sprite_[i]->setX(256 + (i * 3)); } else { jailgames_sprite_[i]->setX(-181 - (i * 3)); } jailgames_sprite_[i]->setY(83 + i); } // Inicializa variables options.section.section = Section::LOGO; // Inicializa el vector de colores const std::vector vColors = {"black", "blue", "red", "magenta", "green", "cyan", "yellow", "bright_white"}; for (auto v : vColors) { color_.push_back(stringToColor(options.video.palette, v)); } // Cambia el color del borde screen_->setBorderColor(stringToColor(options.video.palette, "black")); } // Comprueba el manejador de eventos void Logo::checkEvents() { SDL_Event event; while (SDL_PollEvent(&event)) { globalEvents::check(event); } } // Comprueba las entradas void Logo::checkInput() { globalInputs::check(); } // Gestiona el logo de JAILGAME void Logo::updateJAILGAMES() { if (counter_ > 30) { for (int i = 1; i < (int)jailgames_sprite_.size(); ++i) { const int speed = 8; const int dest = 37; if (jailgames_sprite_[i]->getX() != 37) { if (i % 2 == 0) { jailgames_sprite_[i]->incX(-speed); if (jailgames_sprite_[i]->getX() < dest) { jailgames_sprite_[i]->setX(dest); } } else { jailgames_sprite_[i]->incX(speed); if (jailgames_sprite_[i]->getX() > dest) { jailgames_sprite_[i]->setX(dest); } } } } } } // Gestiona el color de las texturas void Logo::updateTextureColors() { const int ini = 70; const int inc = 4; if (counter_ == ini + inc * 0) { since_1998_texture_->setColor(color_[0].r, color_[0].g, color_[0].b); } else if (counter_ == ini + inc * 1) { since_1998_texture_->setColor(color_[1].r, color_[1].g, color_[1].b); } else if (counter_ == ini + inc * 2) { since_1998_texture_->setColor(color_[2].r, color_[2].g, color_[2].b); } else if (counter_ == ini + inc * 3) { since_1998_texture_->setColor(color_[3].r, color_[3].g, color_[3].b); } else if (counter_ == ini + inc * 4) { since_1998_texture_->setColor(color_[4].r, color_[4].g, color_[4].b); } else if (counter_ == ini + inc * 5) { since_1998_texture_->setColor(color_[5].r, color_[5].g, color_[5].b); } else if (counter_ == ini + inc * 6) { since_1998_texture_->setColor(color_[6].r, color_[6].g, color_[6].b); } else if (counter_ == ini + inc * 7) { since_1998_texture_->setColor(color_[7].r, color_[7].g, color_[7].b); } else if (counter_ == INIT_FADE_ + inc * 0) { jailgames_texture_->setColor(color_[6].r, color_[6].g, color_[6].b); since_1998_texture_->setColor(color_[6].r, color_[6].g, color_[6].b); } else if (counter_ == INIT_FADE_ + inc * 1) { jailgames_texture_->setColor(color_[5].r, color_[5].g, color_[5].b); since_1998_texture_->setColor(color_[5].r, color_[5].g, color_[5].b); } else if (counter_ == INIT_FADE_ + inc * 2) { jailgames_texture_->setColor(color_[4].r, color_[4].g, color_[4].b); since_1998_texture_->setColor(color_[4].r, color_[4].g, color_[4].b); } else if (counter_ == INIT_FADE_ + inc * 3) { jailgames_texture_->setColor(color_[3].r, color_[3].g, color_[3].b); since_1998_texture_->setColor(color_[3].r, color_[3].g, color_[3].b); } else if (counter_ == INIT_FADE_ + inc * 4) { jailgames_texture_->setColor(color_[2].r, color_[2].g, color_[2].b); since_1998_texture_->setColor(color_[2].r, color_[2].g, color_[2].b); } else if (counter_ == INIT_FADE_ + inc * 5) { jailgames_texture_->setColor(color_[1].r, color_[1].g, color_[1].b); since_1998_texture_->setColor(color_[1].r, color_[1].g, color_[1].b); } else if (counter_ == INIT_FADE_ + inc * 6) { jailgames_texture_->setColor(color_[0].r, color_[0].g, color_[0].b); since_1998_texture_->setColor(color_[0].r, color_[0].g, color_[0].b); } } // Actualiza las variables void Logo::update() { // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego if (SDL_GetTicks() - ticks_ > GAME_SPEED) { // Actualiza el contador de ticks ticks_ = SDL_GetTicks(); // Comprueba las entradas checkInput(); // Incrementa el contador counter_++; // Gestiona el logo de JAILGAME updateJAILGAMES(); // Gestiona el color de las texturas updateTextureColors(); screen_->update(); // Comprueba si ha terminado el logo if (counter_ == END_LOGO_ + POST_LOGO_) { endSection(); } } } // Dibuja en pantalla void Logo::render() { // Prepara para empezar a dibujar en la textura de juego screen_->start(); // Limpia la pantalla screen_->clean(); // Dibuja los objetos for (auto s : jailgames_sprite_) { s->render(); } since_1998_sprite_->render(); // Vuelca el contenido del renderizador en pantalla screen_->render(); } // Bucle para el logo del juego void Logo::run() { // Detiene la música JA_StopMusic(); while (options.section.section == Section::LOGO) { update(); checkEvents(); render(); } } // Termina la sección void Logo::endSection() { if (options.section.subsection == Subsection::LOGO_TO_TITLE) { options.section.section = Section::TITLE; } else if (options.section.subsection == Subsection::LOGO_TO_INTRO) { options.section.section = Section::LOADING_SCREEN; } }