#include "logo.h" #include // for SDL_Renderer #include // for SDL_GetTicks #include // for SDL_WINDOWEVENT_SIZE_CHANGED #include // for basic_string #include "asset.h" // for Asset #include "global_inputs.h" // for globalInputs::check #include "input.h" // for Input #include "jail_audio.h" // for JA_StopMusic #include "param.h" // for param #include "screen.h" // for Screen #include "section.h" // for name, SectionName, options, SectionOptions #include "sprite.h" // for Sprite #include "texture.h" // for Texture // Constructor Logo::Logo() { // Copia la dirección de los objetos SDL_Renderer *renderer = Screen::get()->getRenderer(); // Reserva memoria para los punteros jailTexture = std::make_shared(renderer, Asset::get()->get("logo_jailgames.png")); sinceTexture = std::make_shared(renderer, Asset::get()->get("logo_since_1998.png")); sinceSprite = std::make_unique((param.game.width - sinceTexture->getWidth()) / 2, 83 + jailTexture->getHeight() + 5, sinceTexture->getWidth(), sinceTexture->getHeight(), sinceTexture); // Inicializa variables counter = 0; section::name = section::Name::LOGO; ticks = 0; ticksSpeed = 15; showSinceSprite_cm = 70; initFade_cm = 300; endLogo_cm = 400; postLogoDuration = 20; speed = 8; dest.x = param.game.game_area.center_x - jailTexture->getWidth() / 2; dest.y = param.game.game_area.center_y - jailTexture->getHeight() / 2; sinceSprite->setPosY(dest.y + jailTexture->getHeight() + 5); sinceSprite->setSpriteClip(0, 0, sinceTexture->getWidth(), sinceTexture->getHeight()); sinceSprite->setEnabled(false); sinceTexture->setColor(0x00, 0x00, 0x00); // Esto en linux no hace nada ?? // Crea los sprites de cada linea for (int i = 0; i < jailTexture->getHeight(); ++i) { auto temp = std::make_unique(0, i, jailTexture->getWidth(), 1, jailTexture); temp->setSpriteClip(0, i, jailTexture->getWidth(), 1); const int posX = (i % 2 == 0) ? param.game.width + (i * 3) : -jailTexture->getWidth() - (i * 3); temp->setPosX(posX); temp->setPosY(dest.y + i); jailSprite.push_back(std::move(temp)); } // Inicializa el vector de colores color.push_back({0x00, 0x00, 0x00}); // Black color.push_back({0x00, 0x00, 0xd8}); // Blue color.push_back({0xd8, 0x00, 0x00}); // Red color.push_back({0xd8, 0x00, 0xd8}); // Magenta color.push_back({0x00, 0xd8, 0x00}); // Green color.push_back({0x00, 0xd8, 0xd8}); // Cyan color.push_back({0xd8, 0xd8, 0x00}); // Yellow color.push_back({0xFF, 0xFF, 0xFF}); // Bright white } // Recarga todas las texturas void Logo::reloadTextures() { jailTexture->reLoad(); sinceTexture->reLoad(); } // Comprueba el manejador de eventos void Logo::checkEvents() { SDL_Event event; // Comprueba los eventos que hay en la cola while (SDL_PollEvent(&event)) { // Evento de salida de la aplicación if (event.type == SDL_QUIT) { section::name = section::Name::QUIT; break; } // Comprueba si se ha cambiado el tamaño de la ventana else if (event.type == SDL_WINDOWEVENT) { if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { reloadTextures(); } } } } // Comprueba las entradas void Logo::checkInput() { // Comprueba si se ha pulsado cualquier botón (de los usados para jugar) if (Input::get()->checkAnyButtonPressed()) { JA_StopMusic(); section::name = section::Name::TITLE; section::options = section::Options::TITLE_1; return; } // Comprueba el input para el resto de objetos Screen::get()->checkInput(); // Comprueba los inputs que se pueden introducir en cualquier sección del juego globalInputs::check(); } // Gestiona el logo de JAILGAME void Logo::updateJAILGAMES() { if (counter > 30) { for (int i = 0; i < (int)jailSprite.size(); ++i) { if (jailSprite[i]->getPosX() != dest.x) { if (i % 2 == 0) { jailSprite[i]->incPosX(-speed); if (jailSprite[i]->getPosX() < dest.x) { jailSprite[i]->setPosX(dest.x); } } else { jailSprite[i]->incPosX(speed); if (jailSprite[i]->getPosX() > dest.x) { jailSprite[i]->setPosX(dest.x); } } } } } } // Gestiona el color de las texturas void Logo::updateTextureColors() { constexpr int inc = 4; // Manejo de 'sinceTexture' for (int i = 0; i <= 7; ++i) { if (counter == showSinceSprite_cm + inc * i) { sinceTexture->setColor(color[i].r, color[i].g, color[i].b); } } // Manejo de 'jailTexture' y 'sinceTexture' en el fade for (int i = 0; i <= 6; ++i) { if (counter == initFade_cm + inc * i) { jailTexture->setColor(color[6 - i].r, color[6 - i].g, color[6 - i].b); sinceTexture->setColor(color[6 - i].r, color[6 - i].g, color[6 - i].b); } } } // Actualiza las variables void Logo::update() { // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego if (SDL_GetTicks() - ticks > ticksSpeed) { // Actualiza el contador de ticks ticks = SDL_GetTicks(); // Actualiza el objeto screen Screen::get()->update(); // Comprueba las entradas checkInput(); // Gestiona el logo de JAILGAME updateJAILGAMES(); // Gestiona el color de las texturas updateTextureColors(); // Gestiona el contador y sus eventos counter++; // Comprueba si ha terminado el logo if (counter == endLogo_cm + postLogoDuration) { section::name = section::Name::INTRO; } // Comprueba si se ha de mostrar el sprite else if (counter == showSinceSprite_cm) { sinceSprite->setEnabled(true); } } } // Dibuja en pantalla void Logo::render() { // Prepara para empezar a dibujar en la textura de juego Screen::get()->start(); // Limpia la pantalla Screen::get()->clean(); // Dibuja los sprites for (auto &sprite : jailSprite) { sprite->render(); } sinceSprite->render(); // Vuelca el contenido del renderizador en pantalla Screen::get()->blit(); } // Bucle para el logo del juego void Logo::run() { // Detiene la música JA_StopMusic(); while (section::name == section::Name::LOGO) { checkInput(); update(); checkEvents(); // Tiene que ir antes del render render(); } }