diff --git a/source/const.h b/source/const.h index 2e700f4..5303c3d 100644 --- a/source/const.h +++ b/source/const.h @@ -10,7 +10,7 @@ // Textos #define WINDOW_CAPTION "JailDoctor's Dilemma" #define TEXT_COPYRIGHT "@2022 JailDesigner" -#define VERSION "0.1" +#define VERSION "0.6" // Tamaño de bloque #define BLOCK 8 diff --git a/source/director.cpp b/source/director.cpp index b924e70..8da9785 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -230,6 +230,9 @@ void Director::runLogo() // Ejecuta la seccion de juego de la introducción void Director::runIntro() { + intro = new Intro(renderer, screen, asset); + setSection(intro->run()); + delete intro; } // Ejecuta la seccion de juego con el titulo y los menus diff --git a/source/director.h b/source/director.h index 681ec59..4d2009e 100644 --- a/source/director.h +++ b/source/director.h @@ -9,6 +9,7 @@ #include "game.h" #include "logo.h" #include "title.h" +#include "intro.h" #include "asset.h" #include "const.h" @@ -26,6 +27,7 @@ private: Game *game; // Objeto para gestionar la sección del juego Logo *logo; // Objeto para gestionar la sección del logo del programa Title *title; // Objeto para gestionar la pantalla de título + Intro *intro; // Onjeto para gestionar la introducción del juego 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/intro.cpp b/source/intro.cpp new file mode 100644 index 0000000..9b4cdce --- /dev/null +++ b/source/intro.cpp @@ -0,0 +1,169 @@ +#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(), texture, renderer); + + // Inicializa variables + counter = 0; + section.name = SECTION_PROG_INTRO; + section.subsection = 0; + ticks = 0; + ticksSpeed = 15; + counterLoad1 = 0; + + color_t c = stringToColor("black"); + color.push_back(c); + + c = stringToColor("blue"); + color.push_back(c); + + c = stringToColor("red"); + color.push_back(c); + + c = stringToColor("purple"); + color.push_back(c); + + c = stringToColor("green"); + color.push_back(c); + + c = stringToColor("cyan"); + color.push_back(c); + + c = stringToColor("yellow"); + color.push_back(c); + + c = stringToColor("light_white"); + color.push_back(c); +} + +// Destructor +Intro::~Intro() +{ + delete texture; + delete texture2; + delete sprite; + delete sprite2; + delete eventHandler; +} + +// 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 la primera parte de la carga +void Intro::updateLoad1() +{ + counterLoad1 = std::min(counter / 3, 64); +} + +// Gestiona la segunda parte de la carga +void Intro::updateLoad2() +{ +} + +// Dibuja la pantalla de carga +void Intro::renderLoad() +{ + sprite->render(); + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + + SDL_Rect rect = {0, 0 + counterLoad1, 256, 64 - counterLoad1}; + SDL_RenderFillRect(renderer, &rect); + + rect.y += 64; + SDL_RenderFillRect(renderer, &rect); + + rect.y += 64; + SDL_RenderFillRect(renderer, &rect); +} + +// 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(); + + // Incrementa el contador + counter++; + + // Gestiona la primera parte de la carga + updateLoad1(); + + // Gestiona la segunda parte de la carga + updateLoad2(); + + // Comprueba si ha terminado el logo + if (counter == 1000) + { + section.name = SECTION_PROG_TITLE; + section.subsection = 0; + } + } +} + +// 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(); + + // Vuelca el contenido del renderizador en pantalla + screen->blit(); +} + +// Bucle para el logo del juego +section_t Intro::run() +{ + // Detiene la música + JA_StopMusic(); + + while (section.name == SECTION_PROG_INTRO) + { + update(); + render(); + } + + return section; +} diff --git a/source/intro.h b/source/intro.h new file mode 100644 index 0000000..70ac6d1 --- /dev/null +++ b/source/intro.h @@ -0,0 +1,63 @@ +#pragma once + +#include +#include "const.h" +#include "utils.h" +#include "sprite.h" +#include "screen.h" +#include "asset.h" +#include "jail_audio.h" +#include + +#ifndef INTRO_H +#define INTRO_H + +// Clase Intro +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 + std::vector color; // Vector con los colores para el fade + 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 counterLoad1; + + // Actualiza las variables + void update(); + + // Dibuja en pantalla + void render(); + + // Comprueba el manejador de eventos + void checkEventHandler(); + + // Gestiona la primera parte de la carga + void updateLoad1(); + + // Gestiona la segunda parte de la carga + void updateLoad2(); + + // Dibuja la pantalla de carga + void renderLoad(); + +public: + // Constructor + Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset); + + // Destructor + ~Intro(); + + // Bucle principal + section_t run(); +}; + +#endif diff --git a/source/logo.cpp b/source/logo.cpp index e9a0dd4..7e7c777 100644 --- a/source/logo.cpp +++ b/source/logo.cpp @@ -102,6 +102,115 @@ void Logo::checkEventHandler() } } +// Gestiona el logo de JAILGAME +void Logo::updateJAILGAMES() +{ + if (counter > 30) + { + for (int i = 1; i < sprite.size(); i++) + { + const int speed = 8; + const int dest = 37; + if (sprite[i]->getPosX() != 37) + { + if (i % 2 == 0) + { + sprite[i]->incPosX(-speed); + if (sprite[i]->getPosX() < dest) + { + sprite[i]->setPosX(dest); + } + } + else + { + sprite[i]->incPosX(speed); + if (sprite[i]->getPosX() > dest) + { + sprite[i]->setPosX(dest); + } + } + } + } + } +} + +// Gestiona el color de las texturas +void Logo::updateTextureColors() +{ + const int ini = 70; + const int inc = 4; + + if (counter == ini + inc * 0) + { + texture2->setColor(color[0].r, color[0].g, color[0].b); + } + else if (counter == ini + inc * 1) + { + texture2->setColor(color[1].r, color[1].g, color[1].b); + } + else if (counter == ini + inc * 2) + { + texture2->setColor(color[2].r, color[2].g, color[2].b); + } + else if (counter == ini + inc * 3) + { + texture2->setColor(color[3].r, color[3].g, color[3].b); + } + else if (counter == ini + inc * 4) + { + texture2->setColor(color[4].r, color[4].g, color[4].b); + } + else if (counter == ini + inc * 5) + { + texture2->setColor(color[5].r, color[5].g, color[5].b); + } + else if (counter == ini + inc * 6) + { + texture2->setColor(color[6].r, color[6].g, color[6].b); + } + + else if (counter == ini + inc * 7) + { + texture2->setColor(color[7].r, color[7].g, color[7].b); + } + + else if (counter == initFade + inc * 0) + { + texture->setColor(color[6].r, color[6].g, color[6].b); + texture2->setColor(color[6].r, color[6].g, color[6].b); + } + else if (counter == initFade + inc * 1) + { + texture->setColor(color[5].r, color[5].g, color[5].b); + texture2->setColor(color[5].r, color[5].g, color[5].b); + } + else if (counter == initFade + inc * 2) + { + texture->setColor(color[4].r, color[4].g, color[4].b); + texture2->setColor(color[4].r, color[4].g, color[4].b); + } + else if (counter == initFade + inc * 3) + { + texture->setColor(color[3].r, color[3].g, color[3].b); + texture2->setColor(color[3].r, color[3].g, color[3].b); + } + else if (counter == initFade + inc * 4) + { + texture->setColor(color[2].r, color[2].g, color[2].b); + texture2->setColor(color[2].r, color[2].g, color[2].b); + } + else if (counter == initFade + inc * 5) + { + texture->setColor(color[1].r, color[1].g, color[1].b); + texture2->setColor(color[1].r, color[1].g, color[1].b); + } + else if (counter == initFade + inc * 6) + { + texture->setColor(color[0].r, color[0].g, color[0].b); + texture2->setColor(color[0].r, color[0].g, color[0].b); + } +} + // Actualiza las variables void Logo::update() { @@ -117,115 +226,16 @@ void Logo::update() // Incrementa el contador counter++; - // update de JAILGAMES - if (counter > 30) - { - for (int i = 1; i < sprite.size(); i++) - { - const int speed = 8; - const int dest = 37; - if (sprite[i]->getPosX() != 37) - { - if (i % 2 == 0) - { - sprite[i]->incPosX(-speed); - if (sprite[i]->getPosX() < dest) - { - sprite[i]->setPosX(dest); - } - } - else - { - sprite[i]->incPosX(speed); - if (sprite[i]->getPosX() > dest) - { - sprite[i]->setPosX(dest); - } - } - } - } - } + // Gestiona el logo de JAILGAME + updateJAILGAMES(); - // update de fade - { - const int ini = 70; - const int inc = 4; - - if (counter == ini + inc * 0) - { - texture2->setColor(color[0].r, color[0].g, color[0].b); - } - else if (counter == ini + inc * 1) - { - texture2->setColor(color[1].r, color[1].g, color[1].b); - } - else if (counter == ini + inc * 2) - { - texture2->setColor(color[2].r, color[2].g, color[2].b); - } - else if (counter == ini + inc * 3) - { - texture2->setColor(color[3].r, color[3].g, color[3].b); - } - else if (counter == ini + inc * 4) - { - texture2->setColor(color[4].r, color[4].g, color[4].b); - } - else if (counter == ini + inc * 5) - { - texture2->setColor(color[5].r, color[5].g, color[5].b); - } - else if (counter == ini + inc * 6) - { - texture2->setColor(color[6].r, color[6].g, color[6].b); - } - - else if (counter == ini + inc * 7) - { - texture2->setColor(color[7].r, color[7].g, color[7].b); - } - - else if (counter == initFade + inc * 0) - { - texture->setColor(color[6].r, color[6].g, color[6].b); - texture2->setColor(color[6].r, color[6].g, color[6].b); - } - else if (counter == initFade + inc * 1) - { - texture->setColor(color[5].r, color[5].g, color[5].b); - texture2->setColor(color[5].r, color[5].g, color[5].b); - } - else if (counter == initFade + inc * 2) - { - texture->setColor(color[4].r, color[4].g, color[4].b); - texture2->setColor(color[4].r, color[4].g, color[4].b); - } - else if (counter == initFade + inc * 3) - { - texture->setColor(color[3].r, color[3].g, color[3].b); - texture2->setColor(color[3].r, color[3].g, color[3].b); - } - else if (counter == initFade + inc * 4) - { - texture->setColor(color[2].r, color[2].g, color[2].b); - texture2->setColor(color[2].r, color[2].g, color[2].b); - } - else if (counter == initFade + inc * 5) - { - texture->setColor(color[1].r, color[1].g, color[1].b); - texture2->setColor(color[1].r, color[1].g, color[1].b); - } - else if (counter == initFade + inc * 6) - { - texture->setColor(color[0].r, color[0].g, color[0].b); - texture2->setColor(color[0].r, color[0].g, color[0].b); - } - } + // Gestiona el color de las texturas + updateTextureColors(); // Comprueba si ha terminado el logo if (counter == endLogo + postLogo) { - section.name = SECTION_PROG_TITLE; + section.name = SECTION_PROG_INTRO; section.subsection = 0; } } diff --git a/source/logo.h b/source/logo.h index 7cb3124..1f4bda3 100644 --- a/source/logo.h +++ b/source/logo.h @@ -42,6 +42,12 @@ private: // Comprueba el manejador de eventos void checkEventHandler(); + // Gestiona el logo de JAILGAME + void updateJAILGAMES(); + + // Gestiona el color de las texturas + void updateTextureColors(); + public: // Constructor Logo(SDL_Renderer *renderer, Screen *screen, Asset *asset); diff --git a/todo.txt b/todo.txt index 3827747..3c200e2 100644 --- a/todo.txt +++ b/todo.txt @@ -26,13 +26,13 @@ x (A) Tecla + y - para cambiar tamaño de ventana. O control F1 a F4 {cm:2022-08 (A) Añadir a cada habitación el color del borde (A) Añadir a cada habitación el color del nombre de la habitación -(A) Crear el logo al estilo del logo de ERBE o TOPO, con lineas que lo formen +x (A) Crear el logo al estilo del logo de ERBE o TOPO, con lineas que lo formen (A) El titulo del juego hacerlo parecido al del Jet Set Willy in Paris - Ha de generarse como las cargas de pantalla de spectrum - Luego se colorea - Finalmente, cada elemento cambia de color como si fueran luces de neon -(A) En el titulo del juego, por la parte inferior ha de aparecer una marquesina con texto, al estilo demoscene -(A) La pantalla de titulo no tiene menu, solo un PRESS ENTER TO PLAY +x (A) En el titulo del juego, por la parte inferior ha de aparecer una marquesina con texto, al estilo demoscene +x (A) La pantalla de titulo no tiene menu, solo un PRESS ENTER TO PLAY ## TEMAS