From 91412889c31b4d1923017bf74d77b8b35343f6be Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Tue, 11 Oct 2022 13:16:26 +0200 Subject: [PATCH] Actualizado el proceso de dibujado de la pantalla de carga --- source/director.cpp | 2 + source/intro.cpp | 131 +++++++++++++++++++++++--------------------- source/intro.h | 37 +++++++------ todo.txt | 2 +- 4 files changed, 92 insertions(+), 80 deletions(-) diff --git a/source/director.cpp b/source/director.cpp index 2c22284..c82ea50 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -9,6 +9,8 @@ Director::Director(std::string path) section.name = SECTION_PROG_GAME; section.subsection = 0; + section.name = SECTION_PROG_INTRO; + // Crea el objeto que controla los ficheros de recursos asset = new Asset(path.substr(0, path.find_last_of("\\/"))); diff --git a/source/intro.cpp b/source/intro.cpp index ea42601..aaee78a 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -10,10 +10,10 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, 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); + loadingScreenTexture1 = new LTexture(renderer, asset->get("loading_screen1.png")); + loadingScreenTexture2 = new LTexture(renderer, asset->get("loading_screen2.png")); + sprite1 = new Sprite(0, 0, loadingScreenTexture1->getWidth(), loadingScreenTexture1->getHeight(), loadingScreenTexture1, renderer); + sprite2 = new Sprite(0, 0, loadingScreenTexture2->getWidth(), loadingScreenTexture2->getHeight(), loadingScreenTexture2, 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()); @@ -26,9 +26,35 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset) ticks = 0; ticksSpeed = 15; loadCounter = 0; - loadCounter = 0; - load1 = true; - load2 = false; + lineCounter = 0; + loadingFirstPart = true; + + // Ls lineas que tapan la primera textura + for (int i = 0; i < 192; ++i) + { + lines[i].x1 = 0; + lines[i].x2 = 257; + lines[i].y = i; + } + + // Establece el orden de las lineas para imitar el direccionamiento de memoria del spectrum + for (int i = 0; i < 192; ++i) + { + if (i < 64) + { // Primer bloque de 2K + lineIndex[i] = ((i % 8) * 8) + (i / 8); + } + + else if (i >= 64 && i < 128) + { // Segundo bloque de 2K + lineIndex[i] = 64 + ((i % 8) * 8) + ((i - 64) / 8); + } + + else if (i >= 128 && i < 192) + { // tercer bloque de 2K + lineIndex[i] = 128 + ((i % 8) * 8) + ((i - 128) / 8); + } + } // Cambia el color del borde screen->setBorderColor(stringToColor("black")); @@ -37,9 +63,9 @@ Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset) // Destructor Intro::~Intro() { - delete texture; - delete texture2; - delete sprite; + delete loadingScreenTexture1; + delete loadingScreenTexture2; + delete sprite1; delete sprite2; delete eventHandler; JA_DeleteMusic(loadingSound1); @@ -74,17 +100,34 @@ void Intro::checkEventHandler() // Gestiona el contador de carga void Intro::updateLoad() { - if (load1) + // Primera parte de la carga, la parte en blanco ynegro + if (loadingFirstPart) { - loadCounter = counter / 20; - if (loadCounter == 25) + // Cada 5 pasos el loadCounter se incrementa en uno + const int numSteps = 5; + loadCounter = counter / numSteps; + + if (loadCounter < 192) { - load1 = false; - load2 = true; + const int step = 256 / numSteps; + lines[lineIndex[loadCounter]].x1 = step * (counter % numSteps); + + // Elimina por completo la linea anterior + if (loadCounter > 0) + { + lines[lineIndex[loadCounter - 1]].x1 = 256; + } + } + + // Una vez actualizadas las 192 lineas, pasa a la segunda fase de la carga + else if (loadCounter == 192) + { + loadingFirstPart = false; loadCounter = 0; JA_PlayMusic(loadingSound3); } } + // Segunda parte de la carga, la parte de los bloques en color else { loadCounter += 2; @@ -96,7 +139,7 @@ void Intro::updateLoad() void Intro::updateCounter() { if (preCounter >= 50) - { + { // Si el contador previo ha llegado a 50, empieza a contar el contador normal if (counter == 0) { JA_PlayMusic(loadingSound2); @@ -104,7 +147,7 @@ void Intro::updateCounter() counter++; } else - { + { // Actualiza el precontador preCounter++; } } @@ -113,58 +156,22 @@ void Intro::updateCounter() void Intro::renderLoad() { // Carga 1 - Blanco y negro - if (load1) + if (loadingFirstPart) { - sprite->render(); + // Dibuja la textura de pantalla de carga en blanco y negro en pantalla + sprite1->render(); + + // Dibuja las 192 lineas negras sobre la textura SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); - - // Muestra las lineas 0..63 - if (loadCounter < 8) + for (int i = 0; i < 192; ++i) { - 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); - } + SDL_RenderDrawLine(renderer, lines[i].x1, lines[i].y, lines[i].x2, lines[i].y); } } else // Carga 2 - Color { - sprite->render(); + sprite1->render(); SDL_Rect rect = {0, 0, 8, 8}; for (int i = 0; i < loadCounter; ++i) { @@ -216,8 +223,6 @@ void Intro::render() // 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(); diff --git a/source/intro.h b/source/intro.h index da2a0b2..692c225 100644 --- a/source/intro.h +++ b/source/intro.h @@ -19,22 +19,27 @@ class Intro { 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 "JAILGAMES" - LTexture *texture2; // Textura con los graficos "Since 1998" - SDL_Event *eventHandler; // Manejador de eventos - Sprite *sprite; // Sprite para manejar la textura - Sprite *sprite2; // Sprite para manejar la textura2 - int preCounter; // Contador previo para realizar una pausa inicial - int counter; // Contador - section_t section; // Estado del bucle principal para saber si continua o se sale - Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa - Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa - int loadCounter; // Contador para controlar las cargas - bool load1, load2; - JA_Music loadingSound1, loadingSound2, loadingSound3; + 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 *loadingScreenTexture1; // Textura con la pantalla de carga en blanco y negro + LTexture *loadingScreenTexture2; // Textura con la pantalla de carga en color + SDL_Event *eventHandler; // Manejador de eventos + Sprite *sprite1; // Sprite para manejar la textura loadingScreenTexture1 + Sprite *sprite2; // Sprite para manejar la textura loadingScreenTexture2 + int preCounter; // Contador previo para realizar una pausa inicial + int counter; // Contador + section_t section; // Estado del bucle principal para saber si continua o se sale + Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa + Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa + int loadCounter; // Contador para controlar las cargas + int lineCounter; // Contador para dibujar las lineas de carga + bool loadingFirstPart; // Para saber en que parte de la carga se encuentra + JA_Music loadingSound1; // Sonidos para imitar la carga tipo spectrum + JA_Music loadingSound2; // Sonidos para imitar la carga tipo spectrum + JA_Music loadingSound3; // Sonidos para imitar la carga tipo spectrum + h_line_t lines[192]; + int lineIndex[192]; // Text *text; diff --git a/todo.txt b/todo.txt index 91562a1..3d93168 100644 --- a/todo.txt +++ b/todo.txt @@ -40,7 +40,7 @@ x (A) La pantalla de titulo no tiene menu, solo un PRESS ENTER TO PLAY (A) Añadir color y efectos a los creditos (A) Crear la tipografia de corazon (A) Los Creditos se han de ir escribiendo letra a letra -(A) Arreglar la pantalla de carga para que cargue bit a bit +x (A) Arreglar la pantalla de carga para que cargue bit a bit (A) La musica del titulo ha de seguir sonando en los creditos y el ¿logo? (A) Ha de haber un modo demo en el que se muestran las habitaciones predefinidas (A) Menu de pausa/salir