#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}; } } // Limpia la pantalla //SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 0xFF); //SDL_RenderClear(mRenderer); // 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(); // Actualiza la pantalla //SDL_RenderPresent(mRenderer); // Vuelca el contenido del renderizador en pantalla mScreen->blit(); } return mSection; }