#include "logo.h" // Constructor Logo::Logo(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(); loadTextureFromFile(texture, asset->get("logo.png"), renderer); sprite = new Sprite(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, texture, renderer); // Crea un backbuffer para el renderizador backbuffer = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT); if (backbuffer == NULL) printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError()); // Inicializa variables counter = 0; section.name = SECTION_PROG_LOGO; section.subsection = 0; ticks = 0; ticksSpeed = 15; initFade = 100; endLogo = 200; postLogo = 20; } // Destructor Logo::~Logo() { renderer = nullptr; screen = nullptr; asset = nullptr; texture->unload(); delete texture; texture = nullptr; delete sprite; sprite = nullptr; delete eventHandler; eventHandler = nullptr; SDL_DestroyTexture(backbuffer); backbuffer = nullptr; } // 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(); // 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; } } counter++; // Comprueba si ha terminado el logo if (counter == endLogo + postLogo) { section.name = SECTION_PROG_INTRO; section.subsection = 0; } } } // 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 sprite->render(); // Dibuja el fade if (counter >= initFade) { const SDL_Rect rect = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; const color_t color = {0xFF, 0xFF, 0xFF}; const int fadeLenght = endLogo - initFade; int alpha = (255 * (counter - initFade)) / fadeLenght; if (alpha < 256) SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, alpha); else SDL_SetRenderDrawColor(renderer, color.r, color.g, color.b, 255); SDL_RenderFillRect(renderer, &rect); } // Vuelca el contenido del renderizador en pantalla screen->blit(); } // Bucle para el logo del juego section_t Logo::run() { // Detiene la música JA_StopMusic(); while (section.name == SECTION_PROG_LOGO) { update(); render(); } return section; }