#include "logo.h" #include // Constructor Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, param_t *param, section_t *section) { // Copia la dirección de los objetos this->renderer = renderer; this->screen = screen; this->asset = asset; this->input = input; this->param = param; this->section = section; // Reserva memoria para los punteros eventHandler = new SDL_Event(); jailTexture = new Texture(renderer, asset->get("logo_jailgames.png")); sinceTexture = new Texture(renderer, asset->get("logo_since_1998.png")); sinceSprite = new Sprite((param->gameWidth - sinceTexture->getWidth()) / 2, 83 + jailTexture->getHeight() + 5, sinceTexture->getWidth(), sinceTexture->getHeight(), sinceTexture); sinceSprite->setSpriteClip(0, 0, sinceTexture->getWidth(), sinceTexture->getHeight()); sinceTexture->setColor(0, 0, 0); // Inicializa variables counter = 0; section->name = SECTION_PROG_LOGO; ticks = 0; ticksSpeed = 15; initFade = 300; endLogo = 400; postLogo = 20; speed = 8; dest.x = GAMECANVAS_CENTER_X - jailTexture->getWidth() / 2; dest.y = GAMECANVAS_CENTER_Y - jailTexture->getHeight() / 2; sinceSprite->setPosY(dest.y + jailTexture->getHeight() + 5); // Crea los sprites de cada linea for (int i = 0; i < jailTexture->getHeight(); ++i) { Sprite *temp = new Sprite(0, i, jailTexture->getWidth(), 1, jailTexture); temp->setSpriteClip(0, i, jailTexture->getWidth(), 1); const int posX = (i % 2 == 0) ? param->gameWidth + (i * 3) : -jailTexture->getWidth() - (i * 3); temp->setPosX(posX); temp->setPosY(dest.y + i); jailSprite.push_back(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 } // Destructor Logo::~Logo() { for (auto s : jailSprite) { delete s; } delete sinceSprite; delete eventHandler; } // Recarga todas las texturas void Logo::reloadTextures() { jailTexture->reLoad(); sinceTexture->reLoad(); } // Comprueba el manejador de eventos void Logo::checkEvents() { // Comprueba los eventos que hay en la cola while (SDL_PollEvent(eventHandler) != 0) { // Evento de salida de la aplicación if (eventHandler->type == SDL_QUIT) { section->name = SECTION_PROG_QUIT; break; } // Comprueba si se ha cambiado el tamaño de la ventana else if (eventHandler->type == SDL_WINDOWEVENT) { if (eventHandler->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { reloadTextures(); } } } } // Comprueba las entradas void Logo::checkInput() { if (input->checkInput(input_exit, DO_NOT_ALLOW_REPEAT)) { section->name = SECTION_PROG_QUIT; } else if (input->checkAnyButtonPressed()) { section->name = SECTION_PROG_TITLE; section->subsection = SUBSECTION_TITLE_1; } // Comprueba el input para el resto de objetos screen->checkInput(); } // 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() { const int ini = 70; const int inc = 4; if (counter == ini + inc * 0) { sinceTexture->setColor(color[0].r, color[0].g, color[0].b); } else if (counter == ini + inc * 1) { sinceTexture->setColor(color[1].r, color[1].g, color[1].b); } else if (counter == ini + inc * 2) { sinceTexture->setColor(color[2].r, color[2].g, color[2].b); } else if (counter == ini + inc * 3) { sinceTexture->setColor(color[3].r, color[3].g, color[3].b); } else if (counter == ini + inc * 4) { sinceTexture->setColor(color[4].r, color[4].g, color[4].b); } else if (counter == ini + inc * 5) { sinceTexture->setColor(color[5].r, color[5].g, color[5].b); } else if (counter == ini + inc * 6) { sinceTexture->setColor(color[6].r, color[6].g, color[6].b); } else if (counter == ini + inc * 7) { sinceTexture->setColor(color[7].r, color[7].g, color[7].b); } else if (counter == initFade + inc * 0) { jailTexture->setColor(color[6].r, color[6].g, color[6].b); sinceTexture->setColor(color[6].r, color[6].g, color[6].b); } else if (counter == initFade + inc * 1) { jailTexture->setColor(color[5].r, color[5].g, color[5].b); sinceTexture->setColor(color[5].r, color[5].g, color[5].b); } else if (counter == initFade + inc * 2) { jailTexture->setColor(color[4].r, color[4].g, color[4].b); sinceTexture->setColor(color[4].r, color[4].g, color[4].b); } else if (counter == initFade + inc * 3) { jailTexture->setColor(color[3].r, color[3].g, color[3].b); sinceTexture->setColor(color[3].r, color[3].g, color[3].b); } else if (counter == initFade + inc * 4) { jailTexture->setColor(color[2].r, color[2].g, color[2].b); sinceTexture->setColor(color[2].r, color[2].g, color[2].b); } else if (counter == initFade + inc * 5) { jailTexture->setColor(color[1].r, color[1].g, color[1].b); sinceTexture->setColor(color[1].r, color[1].g, color[1].b); } else if (counter == initFade + inc * 6) { jailTexture->setColor(color[0].r, color[0].g, color[0].b); sinceTexture->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 > ticksSpeed) { // Actualiza el contador de ticks ticks = SDL_GetTicks(); // Actualiza el objeto screen screen->update(); // Comprueba las entradas checkInput(); // Incrementa el contador counter++; // Gestiona el logo de JAILGAME updateJAILGAMES(); // Gestiona el color de las texturas updateTextureColors(); // Comprueba si ha terminado el logo if (counter == endLogo + postLogo) { section->name = SECTION_PROG_INTRO; } } } // 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 sprites for (auto s : jailSprite) { s->render(); } sinceSprite->render(); // Vuelca el contenido del renderizador en pantalla screen->blit(); } // Bucle para el logo del juego void Logo::run() { // Detiene la música JA_StopMusic(); while (section->name == SECTION_PROG_LOGO) { checkInput(); update(); checkEvents(); // Tiene que ir antes del render render(); } }