#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 Texture(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; scene = 1; // 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.at(0)->setPosX(-128); bitmaps.at(0)->setPosY(SCREEN_FIRST_QUARTER_Y - 24); bitmaps.at(0)->setVelX(0.0f); bitmaps.at(0)->setVelY(0.0f); bitmaps.at(0)->setAccelX(0.6f); bitmaps.at(0)->setAccelY(0.0f); bitmaps.at(0)->setSpriteClip(0, 0, 128, 96); bitmaps.at(1)->setPosX(GAME_WIDTH); bitmaps.at(1)->setPosY(SCREEN_FIRST_QUARTER_Y - 24); bitmaps.at(1)->setVelX(-1.0f); bitmaps.at(1)->setVelY(0.0f); bitmaps.at(1)->setAccelX(-0.3f); bitmaps.at(1)->setAccelY(0.0f); bitmaps.at(1)->setSpriteClip(128, 0, 128, 96); bitmaps.at(2)->setPosX(SCREEN_CENTER_X - 64); bitmaps.at(2)->setPosY(-96); bitmaps.at(2)->setVelX(0.0f); bitmaps.at(2)->setVelY(3.0f); bitmaps.at(2)->setAccelX(0.1f); bitmaps.at(2)->setAccelY(0.3f); bitmaps.at(2)->setSpriteClip(0, 96, 128, 96); bitmaps.at(2)->setEnabledCounter(250); bitmaps.at(3)->setPosX(SCREEN_CENTER_X - 64); bitmaps.at(3)->setPosY(GAME_HEIGHT); bitmaps.at(3)->setVelX(0.0f); bitmaps.at(3)->setVelY(-0.7f); bitmaps.at(3)->setAccelX(0.0f); bitmaps.at(3)->setAccelY(0.0f); bitmaps.at(3)->setSpriteClip(128, 96, 128, 96); bitmaps.at(4)->setPosX(SCREEN_CENTER_X - 64); bitmaps.at(4)->setPosY(-96); bitmaps.at(4)->setVelX(0.0f); bitmaps.at(4)->setVelY(3.0f); bitmaps.at(4)->setAccelX(0.1f); bitmaps.at(4)->setAccelY(0.3f); bitmaps.at(4)->setSpriteClip(0, 192, 128, 96); bitmaps.at(5)->setPosX(GAME_WIDTH); bitmaps.at(5)->setPosY(SCREEN_FIRST_QUARTER_Y - 24); bitmaps.at(5)->setVelX(-0.7f); bitmaps.at(5)->setVelY(0.0f); bitmaps.at(5)->setAccelX(0.0f); bitmaps.at(5)->setAccelY(0.0f); bitmaps.at(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->setEnabledCounter(180); texts.push_back(w); } // Un dia qualsevol de l'any 2000 texts.at(0)->setCaption(lang->getText(27)); texts.at(0)->setSpeed(8); // Tot esta tranquil a la UPV texts.at(1)->setCaption(lang->getText(28)); texts.at(1)->setSpeed(8); // Fins que un desaprensiu... texts.at(2)->setCaption(lang->getText(29)); texts.at(2)->setSpeed(12); // HEY! ME ANE A FERME UN CORTAET... texts.at(3)->setCaption(lang->getText(30)); texts.at(3)->setSpeed(8); // UAAAAAAAAAAAAA!!! texts.at(4)->setCaption(lang->getText(31)); texts.at(4)->setSpeed(1); // Espera un moment... texts.at(5)->setCaption(lang->getText(32)); texts.at(5)->setSpeed(16); // Si resulta que no tinc solt! texts.at(6)->setCaption(lang->getText(33)); texts.at(6)->setSpeed(2); // MERDA DE MAQUINA! texts.at(7)->setCaption(lang->getText(34)); texts.at(7)->setSpeed(3); // Blop... blop... blop... texts.at(8)->setCaption(lang->getText(35)); texts.at(8)->setSpeed(16); 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)) { switch (eventHandler->key.keysym.scancode) { case SDL_SCANCODE_F: screen->switchVideoMode(); texture->reLoad(); break; case SDL_SCANCODE_F1: screen->setWindowSize(1); texture->reLoad(); break; case SDL_SCANCODE_F2: screen->setWindowSize(2); texture->reLoad(); break; case SDL_SCANCODE_F3: screen->setWindowSize(3); texture->reLoad(); break; case SDL_SCANCODE_F4: screen->setWindowSize(4); texture->reLoad(); break; case SDL_SCANCODE_F5: screen->showText("HOLA MAMA!"); break; default: JA_StopMusic(); section.name = PROG_SECTION_TITLE; section.subsection = TITLE_SECTION_1; break; } } } } // Actualiza las escenas de la intro void Intro::updateScenes() { switch (scene) { case 1: // Primera imagen - UPV if (!bitmaps.at(0)->hasFinished()) { bitmaps.at(0)->setEnabled(true); } // Primer texto de la primera imagen if (bitmaps.at(0)->hasFinished() && !texts.at(0)->hasFinished()) { texts.at(0)->setEnabled(true); } // Segundo texto de la primera imagen if (texts.at(0)->hasFinished() && !texts.at(1)->hasFinished()) { texts.at(0)->setEnabled(false); texts.at(1)->setEnabled(true); } // Tercer texto de la primera imagen if (texts.at(1)->hasFinished() && !texts.at(2)->hasFinished()) { texts.at(1)->setEnabled(false); texts.at(2)->setEnabled(true); } // Fin de la primera escena if (texts.at(2)->hasFinished()) { bitmaps.at(0)->setEnabled(false); texts.at(2)->setEnabled(false); scene++; } break; case 2: // Segunda imagen - Máquina if (!bitmaps.at(1)->hasFinished()) { bitmaps.at(1)->setEnabled(true); } // Primer texto de la segunda imagen if (bitmaps.at(1)->hasFinished() && !texts.at(3)->hasFinished()) { texts.at(3)->setEnabled(true); } // Fin de la segunda escena if (texts.at(3)->hasFinished()) { bitmaps.at(1)->setEnabled(false); texts.at(3)->setEnabled(false); scene++; } break; case 3: // Tercera imagen junto con primer texto - GRITO if (!bitmaps.at(2)->hasFinished() && !texts.at(4)->hasFinished()) { bitmaps.at(2)->setEnabled(true); texts.at(4)->setEnabled(true); } // Fin de la tercera escena if (bitmaps.at(2)->hasFinished() && texts.at(4)->hasFinished()) { bitmaps.at(2)->setEnabled(false); texts.at(4)->setEnabled(false); scene++; } break; case 4: // Cuarta imagen junto con primer texto - Reflexión if (!bitmaps.at(3)->hasFinished() && !texts.at(5)->hasFinished()) { bitmaps.at(3)->setEnabled(true); texts.at(5)->setEnabled(true); } // Segundo texto de la cuarta imagen if (texts.at(5)->hasFinished() && !texts.at(6)->hasFinished()) { texts.at(5)->setEnabled(false); texts.at(6)->setEnabled(true); } // Fin de la cuarta escena if (bitmaps.at(3)->hasFinished() && texts.at(6)->hasFinished()) { bitmaps.at(3)->setEnabled(false); texts.at(6)->setEnabled(false); scene++; } break; case 5: // Quinta imagen - Patada if (!bitmaps.at(4)->hasFinished()) { bitmaps.at(4)->setEnabled(true); } // Primer texto de la quinta imagen if (bitmaps.at(4)->hasFinished() && !texts.at(7)->hasFinished()) { texts.at(7)->setEnabled(true); } // Fin de la quinta escena if (bitmaps.at(4)->hasFinished() && texts.at(7)->hasFinished()) { bitmaps.at(4)->setEnabled(false); texts.at(7)->setEnabled(false); scene++; } break; case 6: // Sexta imagen junto con texto - Globos de café if (!bitmaps.at(5)->hasFinished() && !texts.at(8)->hasFinished()) { bitmaps.at(5)->setEnabled(true); texts.at(8)->setEnabled(true); } // Acaba el último texto if (bitmaps.at(5)->hasFinished() && texts.at(8)->hasFinished()) { bitmaps.at(5)->setEnabled(false); texts.at(8)->setEnabled(false); JA_StopMusic(); section.name = PROG_SECTION_TITLE; section.subsection = TITLE_SECTION_1; } break; default: break; } } // 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(); } // Actualiza las escenas de la intro updateScenes(); screen->updateNotifier(); } } // 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; }