#include "intro.h" #ifdef __MIPSEL__ #include #include #endif // Constructor Intro::Intro(SDL_Renderer *renderer, std::string *fileList) { // Copia la dirección del renderizador mRenderer = renderer; // Copia la dirección del la lista de ficheros mFileList = fileList; // Reserva memoria para los punteros mEventHandler = new SDL_Event(); mBitmapTexture = new LTexture(); mTextTexture = new LTexture(); for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) mBitmap[i] = new SmartSprite(); for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) mText[i] = new Text2(mTextTexture, mRenderer); } // Destructor Intro::~Intro() { 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 mText[i]; mText[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++) { mText[i]->init(TEXT_VARIABLE, 10); mText[i]->setId(6 + i); mText[i]->setIntroEvents(&mEvents[0]); mText[i]->setPosX(BLOCK * 0); mText[i]->setPosY(SCREEN_HEIGHT - (BLOCK * 6)); mText[i]->setKerning(-1); mText[i]->setEnabled(false); mText[i]->setEnabledTimer(180); } mText[0]->setCaption("Un dia qualsevol de l'any 2000"); mText[0]->setWrittingSpeed(10); mText[1]->setCaption("Tot esta tranquil a la UPV"); mText[1]->setWrittingSpeed(10); mText[2]->setCaption("Fins que un desaprensiu..."); mText[2]->setWrittingSpeed(15); mText[3]->setCaption("HEY! ME ANE A FERME UN CORTAET..."); mText[3]->setWrittingSpeed(10); mText[4]->setCaption("UAAAAAAAAAAAAA!!!"); mText[4]->setWrittingSpeed(1); mText[5]->setCaption("Espera un moment..."); mText[5]->setWrittingSpeed(20); mText[6]->setCaption("Si resulta que no tinc solt!"); mText[6]->setWrittingSpeed(2); mText[7]->setCaption("MERDA DE MAQUINA!"); mText[7]->setWrittingSpeed(3); mText[8]->setCaption("Blop... blop... blop..."); mText[8]->setWrittingSpeed(20); for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) { mText[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 if ((JA_GetMusicState() == JA_MUSIC_INVALID) || (JA_GetMusicState() == JA_MUSIC_STOPPED)) { // Reproduce la música JA_PlayMusic(mMusic, 0); } while (mSection.name == PROG_SECTION_INTRO) { if (SDL_GetTicks() - mTicks > mTicksSpeed) { // Actualiza el contador de ticks mTicks = SDL_GetTicks(); // 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 los objetos for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) mBitmap[i]->update(); for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) mText[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)) { mText[0]->setEnabled(true); mEvents[TEXT0] = EVENT_RUNNING; } // Segundo texto de la primera imagen if ((mEvents[TEXT0] == EVENT_COMPLETED) && (mEvents[TEXT1] == EVENT_WAITING)) { mText[0]->setEnabled(false); mText[1]->setEnabled(true); mEvents[TEXT1] = EVENT_RUNNING; } // Tercer texto de la primera imagen if ((mEvents[TEXT1] == EVENT_COMPLETED) && (mEvents[TEXT2] == EVENT_WAITING)) { mText[1]->setEnabled(false); mText[2]->setEnabled(true); mEvents[TEXT2] = EVENT_RUNNING; } // Segunda imagen - Máquina if ((mEvents[TEXT2] == EVENT_COMPLETED) && (mEvents[BITMAP1] == EVENT_WAITING)) { mBitmap[0]->setEnabled(false); mText[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)) { mText[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); mText[3]->setEnabled(false); mBitmap[2]->setEnabled(true); mText[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); mText[4]->setEnabled(false); mBitmap[3]->setEnabled(true); mText[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)) { mText[5]->setEnabled(false); mText[6]->setEnabled(true); mEvents[TEXT6] = EVENT_RUNNING; } // Quinta imagen - Patada if ((mEvents[TEXT6] == EVENT_COMPLETED) && (mEvents[BITMAP4] == EVENT_WAITING)) { mBitmap[3]->setEnabled(false); mText[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)) { mText[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); mText[7]->setEnabled(false); mBitmap[5]->setEnabled(true); mText[8]->setEnabled(true); mEvents[BITMAP5] = EVENT_RUNNING; mEvents[TEXT8] = EVENT_RUNNING; } // Acaba el último texto if (mEvents[TEXT8] == EVENT_COMPLETED) { mText[8]->setEnabled(false); JA_StopMusic(); mSection = {PROG_SECTION_TITLE, TITLE_SECTION_1}; } } // Limpia la pantalla SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 0xFF); SDL_RenderClear(mRenderer); // Dibuja los objetos for (int i = 0; i < INTRO_TOTAL_BITMAPS; i++) mBitmap[i]->render(); for (int i = 0; i < INTRO_TOTAL_TEXTS; i++) mText[i]->render(); // Actualiza la pantalla SDL_RenderPresent(mRenderer); } return mSection; }