diff --git a/source/const.h b/source/const.h index 9857cd2..d6bc717 100644 --- a/source/const.h +++ b/source/const.h @@ -54,11 +54,6 @@ const int SCREEN_THIRD_QUARTER_Y = (GAME_HEIGHT / 4) * 3; #define TITLE_SECTION_3 5 #define TITLE_SECTION_INSTRUCTIONS 6 -// Estados de cada elemento que pertenece a un evento -#define EVENT_WAITING 1 -#define EVENT_RUNNING 2 -#define EVENT_COMPLETED 3 - // Ningun tipo #define NO_KIND 0 diff --git a/source/director.cpp b/source/director.cpp index dd7e2ca..b057b16 100644 --- a/source/director.cpp +++ b/source/director.cpp @@ -407,7 +407,7 @@ void Director::runGame() void Director::run() { // Bucle principal - while (!section.name == PROG_SECTION_QUIT) + while (section.name != PROG_SECTION_QUIT) { switch (section.name) { diff --git a/source/intro.cpp b/source/intro.cpp index d84a278..1f2f524 100644 --- a/source/intro.cpp +++ b/source/intro.cpp @@ -1,381 +1,383 @@ #include "intro.h" // Constructor -Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *mAsset, Lang *lang) +Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang) { // Copia los punteros - mRenderer = renderer; - mScreen = screen; - mLang = lang; - this->mAsset = mAsset; + this->renderer = renderer; + this->screen = screen; + this->lang = lang; + this->asset = asset; - // Reserva memoria para los punteros - mEventHandler = new SDL_Event(); - mBitmapTexture = new LTexture(mRenderer,mAsset->get("intro.png")); - mText = new Text(mAsset->get("nokia.png"), mAsset->get("nokia.txt"), mRenderer); + // Reserva memoria para los objetos + eventHandler = new SDL_Event(); + texture = new LTexture(renderer, asset->get("intro.png")); + text = new Text(asset->get("nokia.png"), asset->get("nokia.txt"), renderer); - for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + // Carga los recursos + loadMedia(); + + // Inicializa variables + section.name = PROG_SECTION_INTRO; + section.subsection = 0; + ticks = 0; + ticksSpeed = 15; + + // Inicializa los bitmaps de la intro + const int totalBitmaps = 6; + for (int i = 0; i < totalBitmaps; ++i) { - mBitmap[i] = new SmartSprite(mBitmapTexture, mRenderer); + SmartSprite *ss = new SmartSprite(texture, renderer); + ss->setWidth(128); + ss->setHeight(96); + ss->setEnabledCounter(20); + ss->setDestX(SCREEN_CENTER_X - 64); + ss->setDestY(SCREEN_FIRST_QUARTER_Y - 24); + bitmaps.push_back(ss); } - for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + bitmaps[0]->setPosX(-128); + bitmaps[0]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + bitmaps[0]->setVelX(0.0f); + bitmaps[0]->setVelY(0.0f); + bitmaps[0]->setAccelX(0.6f); + bitmaps[0]->setAccelY(0.0f); + bitmaps[0]->setSpriteClip(0, 0, 128, 96); + + bitmaps[1]->setPosX(GAME_WIDTH); + bitmaps[1]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + bitmaps[1]->setVelX(-1.0f); + bitmaps[1]->setVelY(0.0f); + bitmaps[1]->setAccelX(-0.3f); + bitmaps[1]->setAccelY(0.0f); + bitmaps[1]->setSpriteClip(128, 0, 128, 96); + + bitmaps[2]->setPosX(SCREEN_CENTER_X - 64); + bitmaps[2]->setPosY(-96); + bitmaps[2]->setVelX(0.0f); + bitmaps[2]->setVelY(3.0f); + bitmaps[2]->setAccelX(0.1f); + bitmaps[2]->setAccelY(0.3f); + bitmaps[2]->setSpriteClip(0, 96, 128, 96); + bitmaps[2]->setEnabledCounter(250); + + bitmaps[3]->setPosX(SCREEN_CENTER_X - 64); + bitmaps[3]->setPosY(GAME_HEIGHT); + bitmaps[3]->setVelX(0.0f); + bitmaps[3]->setVelY(-0.7f); + bitmaps[3]->setAccelX(0.0f); + bitmaps[3]->setAccelY(0.0f); + bitmaps[3]->setSpriteClip(128, 96, 128, 96); + + bitmaps[4]->setPosX(SCREEN_CENTER_X - 64); + bitmaps[4]->setPosY(-96); + bitmaps[4]->setVelX(0.0f); + bitmaps[4]->setVelY(3.0f); + bitmaps[4]->setAccelX(0.1f); + bitmaps[4]->setAccelY(0.3f); + bitmaps[4]->setSpriteClip(0, 192, 128, 96); + + bitmaps[5]->setPosX(GAME_WIDTH); + bitmaps[5]->setPosY(SCREEN_FIRST_QUARTER_Y - 24); + bitmaps[5]->setVelX(-0.7f); + bitmaps[5]->setVelY(0.0f); + bitmaps[5]->setAccelX(0.0f); + bitmaps[5]->setAccelY(0.0f); + bitmaps[5]->setSpriteClip(128, 192, 128, 96); + + // Inicializa los textos de la intro + const int totalTexts = 9; + for (int i = 0; i < totalTexts; ++i) { - mWriter[i] = new Writer(mText); + Writer *w = new Writer(text); + w->setPosX(BLOCK * 0); + w->setPosY(GAME_HEIGHT - (BLOCK * 6)); + w->setKerning(-1); + w->setEnabled(false); + w->setEnabledTimer(180); + texts.push_back(w); + } + + // Un dia qualsevol de l'any 2000 + texts[0]->setCaption(lang->getText(27)); + texts[0]->setSpeed(10); + + // Tot esta tranquil a la UPV + texts[1]->setCaption(lang->getText(28)); + texts[1]->setSpeed(10); + + // Fins que un desaprensiu... + texts[2]->setCaption(lang->getText(29)); + texts[2]->setSpeed(15); + + // HEY! ME ANE A FERME UN CORTAET... + texts[3]->setCaption(lang->getText(30)); + texts[3]->setSpeed(10); + + // UAAAAAAAAAAAAA!!! + texts[4]->setCaption(lang->getText(31)); + texts[4]->setSpeed(1); + + // Espera un moment... + texts[5]->setCaption(lang->getText(32)); + texts[5]->setSpeed(20); + + // Si resulta que no tinc solt! + texts[6]->setCaption(lang->getText(33)); + texts[6]->setSpeed(2); + + // MERDA DE MAQUINA! + texts[7]->setCaption(lang->getText(34)); + texts[7]->setSpeed(3); + + // Blop... blop... blop... + texts[8]->setCaption(lang->getText(35)); + texts[8]->setSpeed(20); + + for (auto text : texts) + { + text->center(SCREEN_CENTER_X); } } // Destructor Intro::~Intro() { - mRenderer = nullptr; - mScreen = nullptr; - mAsset = nullptr; - mLang = nullptr; + delete eventHandler; - delete mEventHandler; - mEventHandler = nullptr; + texture->unload(); + delete texture; - mBitmapTexture->unload(); - delete mBitmapTexture; - mBitmapTexture = nullptr; - - for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) + for (auto bitmap : bitmaps) { - delete mBitmap[i]; - mBitmap[i] = nullptr; + delete bitmap; } - for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) + for (auto text : texts) { - delete mWriter[i]; - mWriter[i] = nullptr; + delete text; } - 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]->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(GAME_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(GAME_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(GAME_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(GAME_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); + JA_DeleteMusic(music); } // Carga los recursos bool Intro::loadMedia() { - bool success = true; - // Musicas - mMusic = JA_LoadMusic(mAsset->get("intro.ogg").c_str()); + music = JA_LoadMusic(asset->get("intro.ogg").c_str()); - return success; + return true; +} + +// Comprueba los 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 = PROG_SECTION_QUIT; + break; + } + + // Cualquier tecla pulsada + if ((eventHandler->type == SDL_KEYDOWN) || (eventHandler->type == SDL_JOYBUTTONDOWN)) + { + JA_StopMusic(); + section.name = PROG_SECTION_TITLE; + section.subsection = TITLE_SECTION_1; + } + } +} + +// Actualiza las variables del objeto +void Intro::update() +{ + checkEventHandler(); + + if (SDL_GetTicks() - ticks > ticksSpeed) + { + // Actualiza el contador de ticks + ticks = SDL_GetTicks(); + + // Actualiza los objetos + for (auto bitmap : bitmaps) + { + bitmap->update(); + } + + for (auto text : texts) + { + text->update(); + } + + // Guión de eventos + // Primera imagen - UPV + if (!bitmaps[0]->hasFinished()) + { + bitmaps[0]->setEnabled(true); + } + + // Primer texto de la primera imagen + if (bitmaps[0]->hasFinished() && !texts[0]->hasFinished()) + { + texts[0]->setEnabled(true); + } + + /* + // 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(); + section = {PROG_SECTION_TITLE, TITLE_SECTION_1}; + } + */ + } +} + +// Dibuja el objeto en pantalla +void Intro::render() +{ + // Prepara para empezar a dibujar en la textura de juego + screen->start(); + + // Limpia la pantalla + screen->clean(bgColor); + + // Dibuja los objetos + for (auto bitmap : bitmaps) + { + bitmap->render(); + } + + for (auto text : texts) + { + text->render(); + } + + // Vuelca el contenido del renderizador en pantalla + screen->blit(); } // Bucle principal section_t Intro::run() { - init(); + JA_PlayMusic(music, 0); - // Si la música no está sonando la hace sonar - if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED)) + while (section.name == PROG_SECTION_INTRO) { - JA_PlayMusic(mMusic, 0); + update(); + render(); } - 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; + return section; } diff --git a/source/intro.h b/source/intro.h index c8c45b0..a1a8540 100644 --- a/source/intro.h +++ b/source/intro.h @@ -8,64 +8,51 @@ #include "smartsprite.h" #include "utils.h" #include "writer.h" +#include #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 - SDL_Event *mEventHandler; // Manejador de eventos - Asset *mAsset; // Objeto que gestiona todos los ficheros de recursos - 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 + // Objetos + SDL_Renderer *renderer; // El renderizador de la ventana + Screen *screen; // Objeto encargado de dibujar en pantalla + LTexture *texture; // Textura con los graficos + SDL_Event *eventHandler; // Manejador de eventos + Asset *asset; // Objeto que gestiona todos los ficheros de recursos + Lang *lang; // Objeto para gestionar los textos en diferentes idiomas + std::vector bitmaps; // Vector con los sprites inteligentes para los dibujos de la intro + std::vector texts; // Textos de la intro + Text *text; // Textos de la intro + + // Variables + Uint32 ticks; // Contador de ticks para ajustar la velocidad del programa + Uint8 ticksSpeed; // Velocidad a la que se repiten los bucles del programa + section_t section; // Estado del bucle principal para saber si continua o se sale + JA_Music music; // Musica para la intro + + // Actualiza las variables del objeto + void update(); + + // Dibuja el objeto en pantalla + void render(); // Carga los recursos bool loadMedia(); + // Comprueba los eventos + void checkEventHandler(); + public: // Constructor - Intro(SDL_Renderer *renderer, Screen *screen, Asset *mAsset, Lang *lang); + Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang); // Destructor ~Intro(); - // Inicializa las variables - void init(); - // Bucle principal section_t run(); }; diff --git a/source/smartsprite.cpp b/source/smartsprite.cpp index 4936319..404547d 100644 --- a/source/smartsprite.cpp +++ b/source/smartsprite.cpp @@ -7,6 +7,7 @@ SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer) setTexture(texture); setRenderer(renderer); + // BORRABLE *** setPosX(0); setPosY(0); setWidth(0); @@ -19,23 +20,21 @@ SmartSprite::SmartSprite(LTexture *texture, SDL_Renderer *renderer) setSpriteClip(0, 0, 0, 0); + setRotate(false); + setRotateSpeed(0); + setRotateAmount(0.0); + setEnabled(false); - setEnabledTimer(0); + setEnabledCounter(0); + // HASTA AQUI onDestination = false; destX = 0; destY = 0; - setRotate(false); - setRotateSpeed(0); - setRotateAmount(0.0); - counter = 0; - - // El Id siempre es >=0, por lo tanto si no se le asigna Id se queda en negativo - id = -1; - - introEvents = nullptr; + id = 0; + finished = false; } // Destructor @@ -43,6 +42,15 @@ SmartSprite::~SmartSprite() { } +// Pinta el objeto en pantalla +void SmartSprite::render() +{ + if (enabled) + { + MovingSprite::render(); + } +} + // Obtiene el valor de la variable bool SmartSprite::isEnabled() { @@ -50,33 +58,33 @@ bool SmartSprite::isEnabled() } // Establece el valor de la variable -void SmartSprite::setEnabled(bool state) +void SmartSprite::setEnabled(bool enabled) { - enabled = state; + this->enabled = enabled; } // Obtiene el valor de la variable -Uint16 SmartSprite::getEnabledTimer() +int SmartSprite::getEnabledCounter() { return enabledCounter; } // Establece el valor de la variable -void SmartSprite::setEnabledTimer(Uint16 time) +void SmartSprite::setEnabledCounter(int value) { - enabledCounter = time; + enabledCounter = value; } // Establece el valor de la variable -void SmartSprite::setDestX(int value) +void SmartSprite::setDestX(int x) { - destX = value; + destX = xPrev; } // Establece el valor de la variable -void SmartSprite::setDestY(int value) +void SmartSprite::setDestY(int y) { - destY = value; + destY = y; } // Obtiene el valor de la variable @@ -91,101 +99,97 @@ int SmartSprite::getDestY() return destY; } -// Actualiza la posición y comprueba si ha llegado a su destino -bool SmartSprite::update() +// Comprueba el movimiento +void SmartSprite::checkMove() { - if (enabled) + // Comprueba si se desplaza en el eje X hacia la derecha + if ((getAccelX() > 0) || ((getAccelX() == 0) && (getVelX() > 0))) { - MovingSprite::update(); - - // Comprueba si se desplaza en el eje X hacia la derecha - if ((getAccelX() > 0) || ((getAccelX() == 0) && (getVelX() > 0))) + // Comprueba si ha llegado al destino + if (getPosX() > destX) { - // Comprueba si ha llegado al destino - if (getPosX() > destX) - { - // Lo coloca en posición - setPosX(destX); + // Lo coloca en posición + setPosX(destX); - // Lo detiene - setVelX(0.0f); - setAccelX(0.0f); - } + // Lo detiene + setVelX(0.0f); + setAccelX(0.0f); } - // Comprueba si se desplaza en el eje X hacia la izquierda - else if ((getAccelX() < 0) || ((getAccelX() == 0) && (getVelX() < 0))) + } + // Comprueba si se desplaza en el eje X hacia la izquierda + else if ((getAccelX() < 0) || ((getAccelX() == 0) && (getVelX() < 0))) + { + // Comprueba si ha llegado al destino + if (getPosX() < destX) { - // Comprueba si ha llegado al destino - if (getPosX() < destX) - { - // Lo coloca en posición - setPosX(destX); + // Lo coloca en posición + setPosX(destX); - // Lo detiene - setVelX(0.0f); - setAccelX(0.0f); - } - } - - // Comprueba si se desplaza en el eje Y hacia abajo - if ((getAccelY() > 0) || ((getAccelY() == 0) && (getVelY() > 0))) - { - // Comprueba si ha llegado al destino - if (getPosY() > destY) - { - // Lo coloca en posición - setPosY(destY); - - // Lo detiene - setVelY(0.0f); - setAccelY(0.0f); - } - } - // Comprueba si se desplaza en el eje Y hacia arriba - else if ((getAccelY() < 0) || ((getAccelY() == 0) && (getVelY() < 0))) - { - // Comprueba si ha llegado al destino - if (getPosY() < destY) - { - // Lo coloca en posición - setPosY(destY); - - // Lo detiene - setVelY(0.0f); - setAccelY(0.0f); - } - } - - // Comprueba si ha llegado a su destino - if ((getPosX() == destX) && (getPosY() == destY)) - onDestination = true; - else - onDestination = false; - - // Si esta en el destino comprueba su contador - if (onDestination) - { - // Si el contador es mayor que cero, lo decrementa - if (enabledCounter > 0) - { - enabledCounter--; - } - // Si ha llegado a cero, deshabilita el objeto o manda el aviso en función de si tiene Id - else if (enabledCounter == 0) - { - if (id < 0) - { - enabled = false; - } - else - { - introEvents[id] = EVENT_COMPLETED; - } - } + // Lo detiene + setVelX(0.0f); + setAccelX(0.0f); } } - return onDestination; + // Comprueba si se desplaza en el eje Y hacia abajo + if ((getAccelY() > 0) || ((getAccelY() == 0) && (getVelY() > 0))) + { + // Comprueba si ha llegado al destino + if (getPosY() > destY) + { + // Lo coloca en posición + setPosY(destY); + + // Lo detiene + setVelY(0.0f); + setAccelY(0.0f); + } + } + // Comprueba si se desplaza en el eje Y hacia arriba + else if ((getAccelY() < 0) || ((getAccelY() == 0) && (getVelY() < 0))) + { + // Comprueba si ha llegado al destino + if (getPosY() < destY) + { + // Lo coloca en posición + setPosY(destY); + + // Lo detiene + setVelY(0.0f); + setAccelY(0.0f); + } + } +} + +// Actualiza la posición y comprueba si ha llegado a su destino +void SmartSprite::update() +{ + if (!enabled) + { + return; + } + + // Actualiza las variables internas del objeto + MovingSprite::update(); + + // Comprueba el movimiento + checkMove(); + + // Comprueba si ha llegado a su destino + onDestination = (getPosX() == destX && getPosY() == destY) ? true : false; + + if (onDestination) + { // Si esta en el destino comprueba su contador + if (enabledCounter == 0) + { // Si ha llegado a cero, deshabilita el objeto y lo marca como finalizado + enabled = false; + finished = true; + } + else + { // Si no ha llegado a cero, decrementa el contador + enabledCounter--; + } + } } // Obtiene el valor de la variable @@ -194,21 +198,20 @@ bool SmartSprite::isOnDestination() return onDestination; } -// Pinta el objeto en pantalla -void SmartSprite::render() -{ - if (enabled) - MovingSprite::render(); -} - // Establece el valor de la variable void SmartSprite::setId(int id) { - id = id; + this->id = id; } -// Establece el valor de la variable -void SmartSprite::setIntroEvents(Uint8 *value) +// Obtiene el valor de la variable +int SmartSprite::getId() { - introEvents = value; + return id; +} + +// Obtiene el valor de la variable +bool SmartSprite::hasFinished() +{ + return finished; } \ No newline at end of file diff --git a/source/smartsprite.h b/source/smartsprite.h index 3719a40..c54b7a6 100644 --- a/source/smartsprite.h +++ b/source/smartsprite.h @@ -1,8 +1,9 @@ #pragma once #include -#include "utils.h" #include "animatedsprite.h" +#include "utils.h" +#include #ifndef SMARTSPRITE_H #define SMARTSPRITE_H @@ -11,13 +12,16 @@ class SmartSprite : public AnimatedSprite { private: - bool enabled; // Indica si esta habilitado - bool onDestination; // Indica si está en el destino - int destX; // Posicion de destino en el eje X - int destY; // Posicion de destino en el eje Y - int id; // Identificador - Uint16 enabledCounter; // Contador para deshabilitarlo - Uint8 *introEvents; // Dirección del array de eventos donde notificar el estado + bool enabled; // Indica si esta habilitado + bool onDestination; // Indica si está en el destino + int destX; // Posicion de destino en el eje X + int destY; // Posicion de destino en el eje Y + int id; // Identificador + int enabledCounter; // Contador para deshabilitarlo + bool finished; // Indica si ya ha terminado + + // Comprueba el movimiento + void checkMove(); public: // Constructor @@ -26,23 +30,29 @@ public: // Destructor ~SmartSprite(); + // Actualiza la posición y comprueba si ha llegado a su destino + void update(); + + // Pinta el objeto en pantalla + void render(); + // Obtiene el valor de la variable bool isEnabled(); // Establece el valor de la variable - void setEnabled(bool state); + void setEnabled(bool enabled); // Obtiene el valor de la variable - Uint16 getEnabledTimer(); + int getEnabledCounter(); // Establece el valor de la variable - void setEnabledTimer(Uint16 time); + void setEnabledCounter(int value); // Establece el valor de la variable - void setDestX(int value); + void setDestX(int x); // Establece el valor de la variable - void setDestY(int value); + void setDestY(int y); // Obtiene el valor de la variable int getDestX(); @@ -50,20 +60,17 @@ public: // Obtiene el valor de la variable int getDestY(); - // Actualiza la posición y comprueba si ha llegado a su destino - bool update(); - // Obtiene el valor de la variable bool isOnDestination(); - // Pinta el objeto en pantalla - void render(); - // Establece el valor de la variable void setId(int id); - // Establece el valor de la variable - void setIntroEvents(Uint8 *value); + // Obtiene el valor de la variable + int getId(); + + // Obtiene el valor de la variable + bool hasFinished(); }; #endif diff --git a/source/title.cpp b/source/title.cpp index dd69503..c62e21c 100644 --- a/source/title.cpp +++ b/source/title.cpp @@ -152,7 +152,6 @@ void Title::init(bool demo, Uint8 subsection) // Inicializa el bitmap de Coffee mCoffeeBitmap->setId(0); - mCoffeeBitmap->setIntroEvents(&mEvents[0]); mCoffeeBitmap->setPosX(45); mCoffeeBitmap->setPosY(11 - 200); mCoffeeBitmap->setWidth(167); @@ -169,7 +168,6 @@ void Title::init(bool demo, Uint8 subsection) // Inicializa el bitmap de Crisis mCrisisBitmap->setId(1); - mCrisisBitmap->setIntroEvents(&mEvents[0]); mCrisisBitmap->setPosX(60); mCrisisBitmap->setPosY(57 + 200); mCrisisBitmap->setWidth(137); @@ -224,7 +222,7 @@ void Title::init(bool demo, Uint8 subsection) // Inicializa el vector de eventos de la pantalla de titulo for (int i = 0; i < TITLE_TOTAL_EVENTS; i++) { - mEvents[i] = EVENT_WAITING; + mEvents[i] = 0;//EVENT_WAITING; } // Crea el mosaico de fondo del titulo @@ -559,6 +557,7 @@ section_t Title::run(Uint8 subsection) // Vuelca el contenido del renderizador en pantalla mScreen->blit(); + const int EVENT_COMPLETED = 0; // ******************** TEMPORAL PARA COMPILAR // Si los objetos han llegado a su destino, cambiamos de Sección if ((mEvents[0] == EVENT_COMPLETED) && (mEvents[0] == EVENT_COMPLETED)) { diff --git a/source/writer.cpp b/source/writer.cpp index 2aaa3ec..0c61065 100644 --- a/source/writer.cpp +++ b/source/writer.cpp @@ -4,19 +4,10 @@ // Constructor Writer::Writer(Text *text) { + // Copia los punteros mText = text; - init(); -} -// Destructor -Writer::~Writer() -{ - mText = nullptr; -} - -// Inicializador -void Writer::init() -{ + // Inicializa variables mPosX = 0; mPosY = 0; mKerning = 0; @@ -28,8 +19,61 @@ void Writer::init() mCompleted = false; mEnabled = false; mEnabledTimer = 0; - mId = -1; - mIntroEvents = nullptr; + mId = 0; + finished = false; +} + +// Destructor +Writer::~Writer() +{ +} + +// Actualiza el objeto +void Writer::update() +{ + if (mEnabled) + { + if (!mCompleted) + { // No completado + if (mTimer > 0) + { + mTimer--; + } + + else if (mTimer == 0) + { + mIndex++; + mTimer = mSpeed; + } + + if (mIndex == mLenght) + { + mCompleted = true; + } + } + + if (mCompleted) + { // Completado + if (mEnabledTimer > 0) + { + mEnabledTimer--; + } + else if (mEnabledTimer == 0) + { + mEnabled = false; + finished = true; + } + } + } +} + +// Dibuja el objeto en pantalla +void Writer::render() +{ + if (mEnabled) + { + mText->write(mPosX, mPosY, mCaption, mKerning, mIndex); + } } // Establece el valor de la variable @@ -58,7 +102,7 @@ void Writer::setCaption(std::string text) } // Establece el valor de la variable -void Writer::setSpeed(Uint16 value) +void Writer::setSpeed(int value) { mSpeed = value; mTimer = value; @@ -77,66 +121,17 @@ bool Writer::IsEnabled() } // Establece el valor de la variable -void Writer::setEnabledTimer(Uint16 value) +void Writer::setEnabledTimer(int value) { mEnabledTimer = value; } // Obtiene el valor de la variable -Uint16 Writer::getEnabledTimer() +int Writer::getEnabledTimer() { return mEnabledTimer; } -// Actualiza el objeto -void Writer::update() -{ - if (mEnabled) - { - if (mCompleted == false) - { - if (mTimer > 0) - { - mTimer--; - } - if (mTimer == 0) - { - mIndex++; - mTimer = mSpeed; - } - if (mIndex == mLenght) - { - mCompleted = true; - } - } - if (mCompleted) - { - if (mEnabledTimer > 0) - { - mEnabledTimer--; - } - else if (mEnabledTimer == 0) - { - if (mId < 0) - { - mEnabled = false; - } - else - { - mIntroEvents[mId] = EVENT_COMPLETED; - } - } - } - } -} - -// Dibuja el objeto en pantalla -void Writer::render() -{ - if (mEnabled) - mText->write(mPosX, mPosY, mCaption, mKerning, mIndex); -} - // Centra la cadena de texto a un punto X void Writer::center(int x) { @@ -149,8 +144,8 @@ void Writer::setId(int id) mId = id; } -// Establece el valor de la variable -void Writer::setIntroEvents(Uint8 *value) +// Obtiene el valor de la variable +bool Writer::hasFinished() { - mIntroEvents = value; -} + return finished; +} \ No newline at end of file diff --git a/source/writer.h b/source/writer.h index d816542..ac3f062 100644 --- a/source/writer.h +++ b/source/writer.h @@ -11,20 +11,23 @@ class Writer { private: + // Objetos + Text *mText; // Objeto encargado de escribir el texto + + // Variables int mPosX; // Posicion en el eje X donde empezar a escribir el texto int mPosY; // Posicion en el eje Y donde empezar a escribir el texto int mKerning; // Kerning del texto, es decir, espaciado entre caracteres std::string mCaption; // El texto para escribir - Uint16 mSpeed; // Velocidad de escritura - Uint16 mTimer; // Temporizador de escritura para cada caracter - Uint16 mIndex; // Posición del texto que se está escribiendo - Uint16 mLenght; // Longitud de la cadena a escribir + int mSpeed; // Velocidad de escritura + int mTimer; // Temporizador de escritura para cada caracter + int mIndex; // Posición del texto que se está escribiendo + int mLenght; // Longitud de la cadena a escribir bool mCompleted; // Indica si se ha escrito todo el texto bool mEnabled; // Indica si el objeto está habilitado - Uint16 mEnabledTimer; // Temporizador para deshabilitar el objeto + int mEnabledTimer; // Temporizador para deshabilitar el objeto int mId; // Temporizador para deshabilitar el objeto - Uint8 *mIntroEvents; // Dirección del array de eventos donde notificar el estado - Text *mText; // Objeto encargado de escribir el texto + bool finished; public: // Constructor @@ -33,8 +36,11 @@ public: // Destructor ~Writer(); - // Inicializador - void init(); + // Actualiza el objeto + void update(); + + // Dibuja el objeto en pantalla + void render(); // Establece el valor de la variable void setPosX(int value); @@ -49,7 +55,7 @@ public: void setCaption(std::string text); // Establece el valor de la variable - void setSpeed(Uint16 value); + void setSpeed(int value); // Establece el valor de la variable void setEnabled(bool value); @@ -58,16 +64,10 @@ public: bool IsEnabled(); // Establece el valor de la variable - void setEnabledTimer(Uint16 value); + void setEnabledTimer(int value); // Obtiene el valor de la variable - Uint16 getEnabledTimer(); - - // Actualiza el objeto - void update(); - - // Dibuja el objeto en pantalla - void render(); + int getEnabledTimer(); // Centra la cadena de texto a un punto X void center(int x); @@ -75,8 +75,8 @@ public: // Establece el valor de la variable void setId(int id); - // Establece el valor de la variable - void setIntroEvents(Uint8 *value); + // Obtiene el valor de la variable + bool hasFinished(); }; #endif