#include "intro.h" // Constructor Intro::Intro(SDL_Renderer *renderer, Screen *screen, Asset *asset, Lang *lang) { // Copia los punteros this->renderer = renderer; this->screen = screen; this->lang = lang; this->asset = asset; // 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); // 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) { 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); } 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) { 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() { delete eventHandler; texture->unload(); delete texture; for (auto bitmap : bitmaps) { delete bitmap; } for (auto text : texts) { delete text; } JA_DeleteMusic(music); } // Carga los recursos bool Intro::loadMedia() { // Musicas music = JA_LoadMusic(asset->get("intro.ogg").c_str()); 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() { JA_PlayMusic(music, 0); while (section.name == PROG_SECTION_INTRO) { update(); render(); } return section; }