From f1e3cfe8929b508484f8f80cb63ab6ab4c9b77df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sergio=20Valor=20Mart=C3=ADnez?= Date: Mon, 22 Aug 2022 17:44:24 +0200 Subject: [PATCH] =?UTF-8?q?A=C3=B1adidos=20los=20ficheros=20de=20intro=20y?= =?UTF-8?q?=20logo=20del=20coffee=20crisis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/intro.cpp | 378 +++++++++++++++++++++++++++++++++++++++++++++++ source/intro.h | 72 +++++++++ source/logo.cpp | 151 +++++++++++++++++++ source/logo.h | 45 ++++++ 4 files changed, 646 insertions(+) create mode 100644 source/intro.cpp create mode 100644 source/intro.h create mode 100644 source/logo.cpp create mode 100644 source/logo.h diff --git a/source/intro.cpp b/source/intro.cpp new file mode 100644 index 0000000..b993c0d --- /dev/null +++ b/source/intro.cpp @@ -0,0 +1,378 @@ +#include "intro.h" +#ifdef __MIPSEL__ +#include +#include +#endif + +// Constructor +Intro::Intro(SDL_Renderer *renderer, Screen *screen, std::string *fileList, Lang *lang) +{ + // Copia los punteros + mRenderer = renderer; + mScreen = screen; + mFileList = fileList; + mLang = lang; + + // Reserva memoria para los punteros + mEventHandler = new SDL_Event(); + mBitmapTexture = new LTexture(); + mTextTexture = new LTexture(); + mText = new Text(mFileList[52], mTextTexture, mRenderer); + + for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + mBitmap[i] = new SmartSprite(); + + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + mWriter[i] = new Writer(mText); +} + +// Destructor +Intro::~Intro() +{ + mRenderer = nullptr; + mScreen = nullptr; + mFileList = nullptr; + mLang = nullptr; + + delete mEventHandler; + mEventHandler = nullptr; + + mBitmapTexture->unload(); + delete mBitmapTexture; + mBitmapTexture = nullptr; + + mTextTexture->unload(); + delete mTextTexture; + mTextTexture = nullptr; + + for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + { + delete mBitmap[i]; + mBitmap[i] = nullptr; + } + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + { + delete mWriter[i]; + mWriter[i] = nullptr; + } + + JA_DeleteMusic(mMusic); +} + +// Inicializa las variables +void Intro::init() +{ + // Carga los recursos + loadMedia(); + + mSection = {PROG_SECTION_INTRO, 0}; + mTicks = 0; + mTicksSpeed = 15; + + // Inicializa el vector de eventos de la intro + for (int i = 0; i < INTRO_TOTAL_EVENTS; i++) + mEvents[i] = EVENT_WAITING; + + // Inicializa los bitmaps de la intro + for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + { + mBitmap[i]->init(mBitmapTexture, mRenderer); + mBitmap[i]->setId(i); + mBitmap[i]->setIntroEvents(&mEvents[0]); + mBitmap[i]->setWidth(128); + mBitmap[i]->setHeight(96); + mBitmap[i]->setEnabled(false); + mBitmap[i]->setEnabledTimer(20); + mBitmap[i]->setDestX(SCREEN_CENTER_X - 64); + mBitmap[i]->setDestY(SCREEN_FIRST_QUARTER_Y - 24); + } + + mBitmap[0]->setPosX(-128); + mBitmap[0]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + mBitmap[0]->setVelX(0.0f); + mBitmap[0]->setVelY(0.0f); + mBitmap[0]->setAccelX(0.6f); + mBitmap[0]->setAccelY(0.0f); + mBitmap[0]->setSpriteClip(0, 0, 128, 96); + + mBitmap[1]->setPosX(SCREEN_WIDTH); + mBitmap[1]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + mBitmap[1]->setVelX(-1.0f); + mBitmap[1]->setVelY(0.0f); + mBitmap[1]->setAccelX(-0.3f); + mBitmap[1]->setAccelY(0.0f); + mBitmap[1]->setSpriteClip(128, 0, 128, 96); + + mBitmap[2]->setPosX(SCREEN_CENTER_X - 64); + mBitmap[2]->setPosY(-96); + mBitmap[2]->setVelX(0.0f); + mBitmap[2]->setVelY(3.0f); + mBitmap[2]->setAccelX(0.1f); + mBitmap[2]->setAccelY(0.3f); + mBitmap[2]->setSpriteClip(0, 96, 128, 96); + + mBitmap[2]->setEnabledTimer(250); + + mBitmap[3]->setPosX(SCREEN_CENTER_X - 64); + mBitmap[3]->setPosY(SCREEN_HEIGHT); + mBitmap[3]->setVelX(0.0f); + mBitmap[3]->setVelY(-0.7f); + mBitmap[3]->setAccelX(0.0f); + mBitmap[3]->setAccelY(0.0f); + mBitmap[3]->setSpriteClip(128, 96, 128, 96); + + mBitmap[4]->setPosX(SCREEN_CENTER_X - 64); + mBitmap[4]->setPosY(-96); + mBitmap[4]->setVelX(0.0f); + mBitmap[4]->setVelY(3.0f); + mBitmap[4]->setAccelX(0.1f); + mBitmap[4]->setAccelY(0.3f); + mBitmap[4]->setSpriteClip(0, 192, 128, 96); + + mBitmap[5]->setPosX(SCREEN_WIDTH); + mBitmap[5]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + mBitmap[5]->setVelX(-0.7f); + mBitmap[5]->setVelY(0.0f); + mBitmap[5]->setAccelX(0.0f); + mBitmap[5]->setAccelY(0.0f); + mBitmap[5]->setSpriteClip(128, 192, 128, 96); + + // Inicializa los textos de la intro + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + { + mWriter[i]->init(); + mWriter[i]->setId(6 + i); + mWriter[i]->setIntroEvents(&mEvents[0]); + mWriter[i]->setPosX(BLOCK * 0); + mWriter[i]->setPosY(SCREEN_HEIGHT - (BLOCK * 6)); + mWriter[i]->setKerning(-1); + mWriter[i]->setEnabled(false); + mWriter[i]->setEnabledTimer(180); + } + + // Un dia qualsevol de l'any 2000 + mWriter[0]->setCaption(mLang->getText(27)); + mWriter[0]->setSpeed(10); + + // Tot esta tranquil a la UPV + mWriter[1]->setCaption(mLang->getText(28)); + mWriter[1]->setSpeed(10); + + // Fins que un desaprensiu... + mWriter[2]->setCaption(mLang->getText(29)); + mWriter[2]->setSpeed(15); + + // HEY! ME ANE A FERME UN CORTAET... + mWriter[3]->setCaption(mLang->getText(30)); + mWriter[3]->setSpeed(10); + + // UAAAAAAAAAAAAA!!! + mWriter[4]->setCaption(mLang->getText(31)); + mWriter[4]->setSpeed(1); + + // Espera un moment... + mWriter[5]->setCaption(mLang->getText(32)); + mWriter[5]->setSpeed(20); + + // Si resulta que no tinc solt! + mWriter[6]->setCaption(mLang->getText(33)); + mWriter[6]->setSpeed(2); + + // MERDA DE MAQUINA! + mWriter[7]->setCaption(mLang->getText(34)); + mWriter[7]->setSpeed(3); + + // Blop... blop... blop... + mWriter[8]->setCaption(mLang->getText(35)); + mWriter[8]->setSpeed(20); + + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + mWriter[i]->center(SCREEN_CENTER_X); +} + +// Carga los recursos +bool Intro::loadMedia() +{ + bool success = true; + + // Texturas + success &= loadTextureFromFile(mBitmapTexture, mFileList[33], mRenderer); + success &= loadTextureFromFile(mTextTexture, mFileList[28], mRenderer); + + // Musicas + mMusic = JA_LoadMusic(mFileList[3].c_str()); + + return success; +} + +// Bucle principal +section_t Intro::run() +{ + init(); + + // Si la música no está sonando la hace sonar + if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED)) + JA_PlayMusic(mMusic, 0); + + while (mSection.name == PROG_SECTION_INTRO) + { + // Comprueba los eventos que hay en la cola + while (SDL_PollEvent(mEventHandler) != 0) + { + // Evento de salida de la aplicación + if (mEventHandler->type == SDL_QUIT) + { + mSection.name = PROG_SECTION_QUIT; + break; + } + + if ((mEventHandler->type == SDL_KEYDOWN) || (mEventHandler->type == SDL_JOYBUTTONDOWN)) + { + JA_StopMusic(); + mSection = {PROG_SECTION_TITLE, TITLE_SECTION_1}; + } + } + + // Actualiza las variables + if (SDL_GetTicks() - mTicks > mTicksSpeed) + { + // Actualiza el contador de ticks + mTicks = SDL_GetTicks(); + + // Actualiza los objetos + for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + mBitmap[i]->update(); + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + mWriter[i]->update(); + + // Guión de eventos + // Primera imagen - UPV + if (mEvents[BITMAP0] == EVENT_WAITING) + { + mBitmap[0]->setEnabled(true); + mEvents[BITMAP0] = EVENT_RUNNING; + } + + // Primer texto de la primera imagen + if ((mEvents[BITMAP0] == EVENT_COMPLETED) && (mEvents[TEXT0] == EVENT_WAITING)) + { + mWriter[0]->setEnabled(true); + mEvents[TEXT0] = EVENT_RUNNING; + } + + // Segundo texto de la primera imagen + if ((mEvents[TEXT0] == EVENT_COMPLETED) && (mEvents[TEXT1] == EVENT_WAITING)) + { + mWriter[0]->setEnabled(false); + mWriter[1]->setEnabled(true); + mEvents[TEXT1] = EVENT_RUNNING; + } + + // Tercer texto de la primera imagen + if ((mEvents[TEXT1] == EVENT_COMPLETED) && (mEvents[TEXT2] == EVENT_WAITING)) + { + mWriter[1]->setEnabled(false); + mWriter[2]->setEnabled(true); + mEvents[TEXT2] = EVENT_RUNNING; + } + + // Segunda imagen - Máquina + if ((mEvents[TEXT2] == EVENT_COMPLETED) && (mEvents[BITMAP1] == EVENT_WAITING)) + { + mBitmap[0]->setEnabled(false); + mWriter[2]->setEnabled(false); + mBitmap[1]->setEnabled(true); + mEvents[BITMAP1] = EVENT_RUNNING; + } + + // Primer texto de la segunda imagen + if ((mEvents[BITMAP1] == EVENT_COMPLETED) && (mEvents[TEXT3] == EVENT_WAITING)) + { + mWriter[3]->setEnabled(true); + mEvents[TEXT3] = EVENT_RUNNING; + } + + // Tercera imagen junto con primer texto - GRITO + if ((mEvents[TEXT3] == EVENT_COMPLETED) && (mEvents[BITMAP2] == EVENT_WAITING) && (mEvents[TEXT4] == EVENT_WAITING)) + { + mBitmap[1]->setEnabled(false); + mWriter[3]->setEnabled(false); + mBitmap[2]->setEnabled(true); + mWriter[4]->setEnabled(true); + mEvents[BITMAP2] = EVENT_RUNNING; + mEvents[TEXT4] = EVENT_RUNNING; + } + + // Cuarta imagen junto con primer texto - Reflexión + if ((mEvents[TEXT4] == EVENT_COMPLETED) && (mEvents[BITMAP3] == EVENT_WAITING) && (mEvents[TEXT5] == EVENT_WAITING)) + { + mBitmap[2]->setEnabled(false); + mWriter[4]->setEnabled(false); + mBitmap[3]->setEnabled(true); + mWriter[5]->setEnabled(true); + mEvents[BITMAP3] = EVENT_RUNNING; + mEvents[TEXT5] = EVENT_RUNNING; + } + + // Segundo texto de la cuarta imagen + if ((mEvents[TEXT5] == EVENT_COMPLETED) && (mEvents[TEXT6] == EVENT_WAITING)) + { + mWriter[5]->setEnabled(false); + mWriter[6]->setEnabled(true); + mEvents[TEXT6] = EVENT_RUNNING; + } + + // Quinta imagen - Patada + if ((mEvents[TEXT6] == EVENT_COMPLETED) && (mEvents[BITMAP4] == EVENT_WAITING)) + { + mBitmap[3]->setEnabled(false); + mWriter[6]->setEnabled(false); + mBitmap[4]->setEnabled(true); + mEvents[BITMAP4] = EVENT_RUNNING; + } + + // Primer texto de la quinta imagen + if ((mEvents[BITMAP4] == EVENT_COMPLETED) && (mEvents[TEXT7] == EVENT_WAITING)) + { + mWriter[7]->setEnabled(true); + mEvents[TEXT7] = EVENT_RUNNING; + } + + // Sexta imagen junto con texto - Globos de café + if ((mEvents[TEXT7] == EVENT_COMPLETED) && (mEvents[BITMAP5] == EVENT_WAITING) && (mEvents[TEXT8] == EVENT_WAITING)) + { + mBitmap[4]->setEnabled(false); + mWriter[7]->setEnabled(false); + mBitmap[5]->setEnabled(true); + mWriter[8]->setEnabled(true); + mEvents[BITMAP5] = EVENT_RUNNING; + mEvents[TEXT8] = EVENT_RUNNING; + } + + // Acaba el último texto + if (mEvents[TEXT8] == EVENT_COMPLETED) + { + mWriter[8]->setEnabled(false); + JA_StopMusic(); + mSection = {PROG_SECTION_TITLE, TITLE_SECTION_1}; + } + } + + // Prepara para empezar a dibujar en la textura de juego + mScreen->start(); + + // Limpia la pantalla + mScreen->clean(bgColor); + + // Dibuja los objetos + for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + mBitmap[i]->render(); + for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + mWriter[i]->render(); + + // Vuelca el contenido del renderizador en pantalla + mScreen->blit(); + } + + return mSection; +} diff --git a/source/intro.h b/source/intro.h new file mode 100644 index 0000000..d4182e8 --- /dev/null +++ b/source/intro.h @@ -0,0 +1,72 @@ +#pragma once +#include "ifdefs.h" +#include "const.h" +#include "utils.h" +#include "screen.h" +#include "smartsprite.h" +#include "writer.h" +#include "jail_audio.h" + +#ifndef INTRO_H +#define INTRO_H + +// Cantidad de eventos de la intro +#define INTRO_TOTAL_BITMAPS 6 +#define INTRO_TOTAL_TEXTS 9 +const int INTRO_TOTAL_EVENTS = INTRO_TOTAL_BITMAPS + INTRO_TOTAL_TEXTS; + +// Relaciones de Id con nombres +#define BITMAP0 0 +#define BITMAP1 1 +#define BITMAP2 2 +#define BITMAP3 3 +#define BITMAP4 4 +#define BITMAP5 5 +#define TEXT0 6 +#define TEXT1 7 +#define TEXT2 8 +#define TEXT3 9 +#define TEXT4 10 +#define TEXT5 11 +#define TEXT6 12 +#define TEXT7 13 +#define TEXT8 14 + +// Clase Intro +class Intro +{ +private: + SDL_Renderer *mRenderer; // El renderizador de la ventana + Screen *mScreen; // Objeto encargado de dibujar en pantalla + LTexture *mBitmapTexture; // Textura con los graficos + LTexture *mTextTexture; // Textura con los caracteres de texto + SDL_Event *mEventHandler; // Manejador de eventos + std::string *mFileList; // Lista de ficheros + Lang *mLang; // Objeto para gestionar los textos en diferentes idiomas + section_t mSection; // Estado del bucle principal para saber si continua o se sale + Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa + Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa + SmartSprite *mBitmap[INTRO_TOTAL_BITMAPS]; // Vector con los sprites inteligentes para los dibujos de la intro + Writer *mWriter[INTRO_TOTAL_TEXTS]; // Textos de la intro + Text *mText; // Textos de la intro + Uint8 mEvents[INTRO_TOTAL_EVENTS]; // Vector para coordinar los eventos de la intro + JA_Music mMusic; // Musica para la intro + +public: + // Constructor + Intro(SDL_Renderer *renderer, Screen *screen, std::string *fileList, Lang *lang); + + // Destructor + ~Intro(); + + // Inicializa las variables + void init(); + + // Carga los recursos + bool loadMedia(); + + // Bucle principal + section_t run(); +}; + +#endif diff --git a/source/logo.cpp b/source/logo.cpp new file mode 100644 index 0000000..e7489c3 --- /dev/null +++ b/source/logo.cpp @@ -0,0 +1,151 @@ +#include "logo.h" +#ifdef __MIPSEL__ +#include +#include +#endif + +#define INIT_FADE 100 +#define END_LOGO 200 + +// Constructor +Logo::Logo(SDL_Renderer *renderer, Screen *screen, std::string *fileList) +{ + // Copia la dirección de los objetos + mRenderer = renderer; + mScreen = screen; + mFileList = fileList; + + // Reserva memoria para los punteros + mEventHandler = new SDL_Event(); + mTexture = new LTexture(); + mSprite = new Sprite(); + + // Crea un backbuffer para el renderizador + mBackbuffer = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT); + if (mBackbuffer == NULL) + printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError()); +} + +// Destructor +Logo::~Logo() +{ + mRenderer = nullptr; + mScreen = nullptr; + mFileList = nullptr; + + mTexture->unload(); + delete mTexture; + mTexture = nullptr; + + delete mSprite; + mSprite = nullptr; + + delete mEventHandler; + mEventHandler = nullptr; + + SDL_DestroyTexture(mBackbuffer); + mBackbuffer = nullptr; +} + +// Inicializa las variables necesarias para la sección 'Logo' +void Logo::init() +{ + // Carga los recursos + loadMedia(); + + // Inicializa variables + mCounter = 0; + mSection.name = PROG_SECTION_LOGO; + mSection.subsection = 0; + mSprite->init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, mTexture, mRenderer); + mTicks = 0; + mTicksSpeed = 15; +} + +// Carga los recursos necesarios para la sección 'Logo' +bool Logo::loadMedia() +{ + bool success = true; + + success &= loadTextureFromFile(mTexture, mFileList[35], mRenderer); + + return success; +} + +// Bucle para el logo del juego +section_t Logo::run() +{ + init(); + const SDL_Rect rect = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; + const int fadeLenght = END_LOGO - INIT_FADE; + + while (mSection.name == PROG_SECTION_LOGO) + { + // Comprueba los eventos que hay en la cola + while (SDL_PollEvent(mEventHandler) != 0) + { + // Evento de salida de la aplicación + if (mEventHandler->type == SDL_QUIT) + { + mSection.name = PROG_SECTION_QUIT; + break; + } + + // Cualquier tecla pulsada + if ((mEventHandler->type == SDL_KEYDOWN) || (mEventHandler->type == SDL_JOYBUTTONDOWN)) + { + mSection.name = PROG_SECTION_TITLE; + mSection.subsection = TITLE_SECTION_1; + } + } + + // Prepara para empezar a dibujar en la textura de juego + mScreen->start(); + + // Limpia la pantalla + mScreen->clean(bgColor); + + // Dibuja los objetos + mSprite->render(); + + // Dibuja el fade + if (mCounter >= INIT_FADE) + { + Uint16 alpha = (255 * (mCounter - INIT_FADE)) / fadeLenght; + if (alpha < 256) + SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, alpha); + else + SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 255); + SDL_RenderFillRect(mRenderer, &rect); + } + + // Vuelca el contenido del renderizador en pantalla + mScreen->blit(); + + // Comprueba si ha terminado el logo + if (SDL_GetTicks() - mTicks > mTicksSpeed) + { + // Actualiza el contador de ticks + mTicks = SDL_GetTicks(); + + if (mCounter == 0) + { + if (JA_GetMusicState() == JA_MUSIC_PLAYING) + JA_StopMusic(); + } + + if (mCounter == END_LOGO + 20) + { + mCounter = 0; + mSection.name = PROG_SECTION_INTRO; + mSection.subsection = 0; + } + else + { + mCounter++; + } + } + } + + return mSection; +} diff --git a/source/logo.h b/source/logo.h new file mode 100644 index 0000000..da8a545 --- /dev/null +++ b/source/logo.h @@ -0,0 +1,45 @@ +#pragma once +#include "ifdefs.h" +#include "const.h" +#include "utils.h" +#include "sprite.h" +#include "screen.h" +#include "jail_audio.h" + +#ifndef LOGO_H +#define LOGO_H + +// Clase Logo +class Logo +{ +private: + SDL_Renderer *mRenderer; // El renderizador de la ventana + Screen *mScreen; // Objeto encargado de dibujar en pantalla + std::string *mFileList; // Lista de ficheros + LTexture *mTexture; // Textura con los graficos + SDL_Event *mEventHandler; // Manejador de eventos + SDL_Texture *mBackbuffer; // Textura para usar como backbuffer + Sprite *mSprite; // Sprite con la textura del logo + Uint16 mCounter; // Contador + section_t mSection; // Estado del bucle principal para saber si continua o se sale + Uint32 mTicks; // Contador de ticks para ajustar la velocidad del programa + Uint8 mTicksSpeed; // Velocidad a la que se repiten los bucles del programa + +public: + // Constructor + Logo(SDL_Renderer *renderer, Screen *screen, std::string *fileList); + + // Destructor + ~Logo(); + + // Inicializa las variables + void init(); + + // Carga los recursos + bool loadMedia(); + + // Bucle principal + section_t run(); +}; + +#endif