From 9a9751bfddc206900d08b89953cc05e2bdb7e274 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Sat, 3 Sep 2022 10:17:02 +0200 Subject: [PATCH] Trabajando en el logo. Version con vector de completados --- source/director.cpp | 16 ++++-- source/director.h | 4 +- source/logo.cpp | 127 ++++++++++++++++++++++++++------------------ source/logo.h | 32 ++++++----- source/ltexture.cpp | 4 +- source/sprite.cpp | 12 +++++ source/sprite.h | 6 +++ 7 files changed, 127 insertions(+), 74 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index e86624b..96d1a21 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -17,7 +17,7 @@ Director::Director(std::string path) } else { - section.name = SECTION_PROG_GAME; + section.name = SECTION_PROG_LOGO; section.subsection = 0; } @@ -190,10 +190,9 @@ bool Director::setFileList() asset->add("/media/sound/item.wav", sound); - asset->add("/media/logo/jailgames.wav", bitmap); - asset->add("/media/logo/since_1998.wav", bitmap); - asset->add("/media/logo/seagull.wav", bitmap); - + asset->add("/media/logo/jailgames.png", bitmap); + asset->add("/media/logo/since_1998.png", bitmap); + asset->add("/media/logo/seagull.png", bitmap); return asset->check(); } @@ -216,18 +215,25 @@ void Director::setSection(section_t section) this->section = section; } +// Ejecuta la seccion de juego con el logo void Director::runLogo() { + logo = new Logo(renderer, screen, asset); + setSection(logo->run()); + delete logo; } +// Ejecuta la seccion de juego de la introducción void Director::runIntro() { } +// Ejecuta la seccion de juego con el titulo y los menus void Director::runTitle() { } +// Ejecuta la seccion de juego donde se juega void Director::runGame() { game = new Game(renderer, screen, asset, input); diff --git a/source/director.h b/source/director.h index f4e30d7..4103f2f 100644 --- a/source/director.h +++ b/source/director.h @@ -9,6 +9,7 @@ #include "utils.h" #include "input.h" #include "game.h" +#include "logo.h" #include "asset.h" #include "const.h" @@ -23,7 +24,8 @@ private: SDL_Renderer *renderer; // El renderizador de la ventana Screen *screen; // Objeto encargado de dibujar en pantalla Input *input; // Objeto Input para gestionar las entradas - Game *game; // Objeto para la sección del juego + Game *game; // Objeto para gestionar la sección del juego + Logo *logo; // Objeto para gestionar la sección del logo del programa Asset *asset; // Objeto que gestiona todos los ficheros de recursos struct options_t *options; // Variable con todas las opciones del programa diff --git a/source/logo.cpp b/source/logo.cpp index 92999ed..8b6b892 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -10,14 +10,22 @@ Logo::Logo(SDL_Renderer *renderer, Screen *screen, 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); + texture = new LTexture(renderer, asset->get("jailgames.png")); - // 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()); + for (int i = 0; i < texture->getHeight(); i++) + { + sprite.push_back(new Sprite(0, i, texture->getWidth(), 1, texture, renderer)); + completed.push_back(false); + if (i % 2 == 0) + { + sprite[i]->setPosX(256 + i); + } + else + { + sprite[i]->setPosX(-181 - i); + } + sprite[i]->setPosY(83 + i); + } // Inicializa variables counter = 0; @@ -25,30 +33,44 @@ Logo::Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset) section.subsection = 0; ticks = 0; ticksSpeed = 15; - initFade = 100; - endLogo = 200; + initFade = 300; + endLogo = 400; postLogo = 20; } // Destructor Logo::~Logo() { - renderer = nullptr; - screen = nullptr; - asset = nullptr; - - texture->unload(); delete texture; - texture = nullptr; - delete sprite; - sprite = nullptr; + for (auto s : sprite) + { + delete s; + } delete eventHandler; - eventHandler = nullptr; +} - SDL_DestroyTexture(backbuffer); - backbuffer = nullptr; +// Comprueba el manejador de eventos +void Logo::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_GAME; + section.subsection = 0; + } + } } // Actualiza las variables @@ -60,30 +82,44 @@ void Logo::update() // 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; - } + // Comprueba el manejador de eventos + checkEventHandler(); - // Cualquier tecla pulsada - if ((eventHandler->type == SDL_KEYDOWN) || (eventHandler->type == SDL_JOYBUTTONDOWN)) + // Incrementa el contador + counter++; + + // update de JAILGAMES + for (int i = 1; i < sprite.size(); i++) + { + const int speed = 30; + const int dest = 37; + completed[0] = true; + if (sprite[i]->getPosX() != 37 && completed[i - 1] == true) { - section.name = SECTION_PROG_TITLE; - section.subsection = 0; + if (i % 2 == 0) + { + sprite[i]->incPosX(-speed); + if (sprite[i]->getPosX() < dest) + { + completed[i] = true; + sprite[i]->setPosX(dest); + } + } + else + { + sprite[i]->incPosX(speed); + if (sprite[i]->getPosX() > dest) + { + completed[i] = true; + sprite[i]->setPosX(dest); + } + } } } - - counter++; - // Comprueba si ha terminado el logo if (counter == endLogo + postLogo) { - section.name = SECTION_PROG_INTRO; + section.name = SECTION_PROG_QUIT; section.subsection = 0; } } @@ -92,7 +128,6 @@ void Logo::update() // Dibuja en pantalla void Logo::render() { - // Prepara para empezar a dibujar en la textura de juego screen->start(); @@ -100,21 +135,9 @@ void Logo::render() screen->clean(); // Dibuja los objetos - sprite->render(); - - // Dibuja el fade - if (counter >= initFade) + for (auto s : sprite) { - 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); + s->render(); } // Vuelca el contenido del renderizador en pantalla diff --git a/source/logo.h b/source/logo.h index cee7c7c..2159c2e 100644 --- a/source/logo.h +++ b/source/logo.h @@ -7,6 +7,7 @@ #include "screen.h" #include "asset.h" #include "jail_audio.h" +#include #ifndef LOGO_H #define LOGO_H @@ -15,20 +16,20 @@ class Logo { private: - SDL_Renderer *renderer; // El renderizador de la ventana - Screen *screen; // Objeto encargado de dibujar en pantalla - Asset *asset; // Objeto con los ficheros de recursos - LTexture *texture; // Textura con los graficos - SDL_Event *eventHandler; // Manejador de eventos - SDL_Texture *backbuffer; // Textura para usar como backbuffer - Sprite *sprite; // Sprite con la textura del logo - int counter; // Contador - section_t section; // Estado del bucle principal para saber si continua o se sale - int ticks; // Contador de ticks para ajustar la velocidad del programa - int ticksSpeed; // Velocidad a la que se repiten los bucles del programa - int initFade; // Tiempo del contador cuando inicia el fade a negro - int endLogo; // Tiempo del contador para terminar el logo - int postLogo; // Tiempo que dura el logo con el fade al maximo + SDL_Renderer *renderer; // El renderizador de la ventana + Screen *screen; // Objeto encargado de dibujar en pantalla + Asset *asset; // Objeto con los ficheros de recursos + LTexture *texture; // Textura con los graficos + SDL_Event *eventHandler; // Manejador de eventos + std::vector sprite; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES + std::vector completed; // Indica si el sprite ha llegado a su destino + int counter; // Contador + section_t section; // Estado del bucle principal para saber si continua o se sale + int ticks; // Contador de ticks para ajustar la velocidad del programa + int ticksSpeed; // Velocidad a la que se repiten los bucles del programa + int initFade; // Tiempo del contador cuando inicia el fade a negro + int endLogo; // Tiempo del contador para terminar el logo + int postLogo; // Tiempo que dura el logo con el fade al maximo // Actualiza las variables void update(); @@ -36,6 +37,9 @@ private: // Dibuja en pantalla void render(); + // Comprueba el manejador de eventos + void checkEventHandler(); + public: // Constructor Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset); diff --git a/source/ltexture.cpp b/source/ltexture.cpp index 702e7ca..d9c74cb 100644 --- a/source/ltexture.cpp +++ b/source/ltexture.cpp @@ -79,8 +79,8 @@ bool LTexture::loadFromFile(std::string path, SDL_Renderer *renderer) else { // Obtiene las dimensiones de la imagen - width = loadedSurface->w; - height = loadedSurface->h; + this->width = loadedSurface->w; + this->height = loadedSurface->h; } // Elimina la textura cargada diff --git a/source/sprite.cpp b/source/sprite.cpp index c354b59..dadd5bd 100644 --- a/source/sprite.cpp +++ b/source/sprite.cpp @@ -106,6 +106,18 @@ void Sprite::setPosY(int y) this->y = y; } +// Incrementa el valor de la variable +void Sprite::incPosX(int value) +{ + x += value; +} + +// Incrementa el valor de la variable +void Sprite::incPosY(int value) +{ + y += value; +} + // Establece el valor de la variable void Sprite::setWidth(int w) { diff --git a/source/sprite.h b/source/sprite.h index 96e1687..96aeeba 100644 --- a/source/sprite.h +++ b/source/sprite.h @@ -53,6 +53,12 @@ public: // Establece el valor de la variable void setPosY(int y); + // Incrementa el valor de la variable + void incPosX(int value); + + // Incrementa el valor de la variable + void incPosY(int value); + // Establece el valor de la variable void setWidth(int w);