#include "intro.h" // Constructor Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset) { // Copia la dirección de los objetos this->renderer = renderer; this->screen = screen; this->asset = asset; // Reserva memoria para los punteros eventHandler = new SDL_Event(); texture = new LTexture(renderer, asset->get("loading_screen1.png")); texture2 = new LTexture(renderer, asset->get("loading_screen2.png")); sprite = new Sprite(0, 0, texture->getWidth(), texture->getHeight(), texture, renderer); sprite2 = new Sprite(0, 0, texture2->getWidth(), texture2->getHeight(), texture2, renderer); loadingSound1 = JA_LoadMusic(asset->get("loading_sound1.ogg").c_str()); loadingSound2 = JA_LoadMusic(asset->get("loading_sound2.ogg").c_str()); loadingSound3 = JA_LoadMusic(asset->get("loading_sound3.ogg").c_str()); // Inicializa variables preCounter = 0; counter = 0; section.name = SECTION_PROG_INTRO; section.subsection = 0; ticks = 0; ticksSpeed = 15; loadCounter = 0; loadCounter = 0; load1 = true; load2 = false; // Cambia el color del borde screen->setBorderColor(stringToColor("black")); } // Destructor Intro::~Intro() { delete texture; delete texture2; delete sprite; delete sprite2; delete eventHandler; JA_DeleteMusic(loadingSound1); JA_DeleteMusic(loadingSound2); JA_DeleteMusic(loadingSound3); // delete text; } // Comprueba el manejador de eventos void Intro::checkEventHandler() { // 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; } // Cualquier tecla pulsada if ((eventHandler->type == SDL_KEYDOWN) || (eventHandler->type == SDL_JOYBUTTONDOWN)) { section.name = SECTION_PROG_TITLE; section.subsection = 0; } } } // Gestiona el contador de carga void Intro::updateLoad() { if (load1) { loadCounter = counter / 20; if (loadCounter == 25) { load1 = false; load2 = true; loadCounter = 0; JA_PlayMusic(loadingSound3); } } else { loadCounter += 2; loadCounter = std::min(loadCounter, 768); } } // Gestiona el contador interno void Intro::updateCounter() { if (preCounter >= 50) { if (counter == 0) { JA_PlayMusic(loadingSound2); } ++counter; } else { ++preCounter; } } // Dibuja la pantalla de carga void Intro::renderLoad() { // Carga 1 - Blanco y negro if (load1) { sprite->render(); SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Muestra las lineas 0..63 if (loadCounter < 8) { SDL_Rect rect = {0, 0 + loadCounter, 256, 8 - loadCounter}; SDL_RenderFillRect(renderer, &rect); for (int i = 0; i < 6; ++i) { rect.y += 8; SDL_RenderFillRect(renderer, &rect); } rect.y += 8; rect.h = 128; SDL_RenderFillRect(renderer, &rect); } // Muestra las lineas 64..127 else if (loadCounter >= 8 && loadCounter < 16) { SDL_Rect rect = {0, 64 + (loadCounter - 8), 256, 8 - (loadCounter - 8)}; SDL_RenderFillRect(renderer, &rect); for (int i = 0; i < 6; ++i) { rect.y += 8; SDL_RenderFillRect(renderer, &rect); } rect.y += 8; rect.h = 64; SDL_RenderFillRect(renderer, &rect); } // Muestra las lineas 128..191 else if (loadCounter >= 16 && loadCounter < 23) { SDL_Rect rect = {0, 128 + (loadCounter - 16), 256, 8 - (loadCounter - 16)}; SDL_RenderFillRect(renderer, &rect); for (int i = 0; i < 6; ++i) { rect.y += 8; SDL_RenderFillRect(renderer, &rect); } } } else // Carga 2 - Color { sprite->render(); SDL_Rect rect = {0, 0, 8, 8}; for (int i = 0; i < loadCounter; ++i) { rect.x = (i * 8) % 256; rect.y = (i / 32) * 8; sprite2->setPos(rect); sprite2->setSpriteClip(rect); sprite2->render(); } } } // Actualiza las variables void Intro::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(); // Comprueba el manejador de eventos checkEventHandler(); // Gestiona el contador interno updateCounter(); // Gestiona el contador de carga updateLoad(); // Comprueba si ha terminado la intro if (loadCounter >= 768) { section.name = SECTION_PROG_TITLE; section.subsection = 0; JA_StopMusic(); } } } // Dibuja en pantalla void Intro::render() { // Prepara para empezar a dibujar en la textura de juego screen->start(); // Limpia la pantalla screen->clean(); // Dibuja la pantalla de carga renderLoad(); // text->write(0, 0, std::to_string(loadCounter)); // text->write(0, 8, std::to_string(loadCounter)); // Vuelca el contenido del renderizador en pantalla screen->blit(); } // Bucle para el logo del juego section_t Intro::run() { // Inicia el sonido de carga JA_PlayMusic(loadingSound1); while (section.name == SECTION_PROG_INTRO) { update(); render(); } return section; }