#include "instructions.h" #ifdef __MIPSEL__ #include #include #endif const Uint8 SELF = 0; // Constructor Instructions::Instructions(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(); mItemTexture = new LTexture(); mTextTexture = new LTexture(); mSprite = new Sprite(); mText = new Text(mTextTexture, mRenderer); // Crea un backbuffer para el renderizador mBackbuffer = SDL_CreateTexture(mRenderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, SCREEN_WIDTH, SCREEN_HEIGHT); if (mBackbuffer == NULL) printf("Backbuffer could not be created!\nSDL Error: %s\n", SDL_GetError()); } // Destructor Instructions::~Instructions() { mItemTexture->unload(); delete mItemTexture; mItemTexture = nullptr; mTextTexture->unload(); delete mTextTexture; mTextTexture = nullptr; delete mSprite; mSprite = nullptr; delete mEventHandler; mEventHandler = nullptr; delete mText; mText = nullptr; SDL_DestroyTexture(mBackbuffer); mBackbuffer = nullptr; } // Carga los recursos necesarios para la sección 'Instructions' bool Instructions::loadMedia() { bool success = true; success &= loadTextureFromFile(mItemTexture, mFileList[34], mRenderer); success &= loadTextureFromFile(mTextTexture, mFileList[30], mRenderer); return success; } // Inicializa las variables necesarias para la sección 'Instructions' void Instructions::init() { // Carga los recursos loadMedia(); // Inicializa variables mSection.name = SELF; mSprite->init(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, mItemTexture, mRenderer); mTicks = 0; mTicksSpeed = 15; mText->init(TEXT_FIXED, BLOCK); mManualQuit = false; mCounter = 0; } // Bucle para la pantalla de instrucciones void Instructions::run(Uint8 mode) { init(); while (mSection.name == SELF) { // 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)) { if (mode == INSTRUCTIONS_MODE_AUTO) { JA_StopMusic(); mSection.name = PROG_SECTION_TITLE; mSection.subsection = TITLE_SECTION_1; } else mManualQuit = true; } } // Actualiza las variables if (SDL_GetTicks() - mTicks > mTicksSpeed) { // Actualiza el contador de ticks mTicks = SDL_GetTicks(); // Modo automático if (mode == INSTRUCTIONS_MODE_AUTO) { mCounter++; if (mCounter == INSTRUCTIONS_COUNTER) { mSection.name = PROG_SECTION_TITLE; mSection.subsection = TITLE_SECTION_1; } } // Modo manual else { ++mCounter %= 60000; if (mManualQuit) { mSection.name = PROG_SECTION_TITLE; mSection.subsection = TITLE_SECTION_3; } } } // Pinta en pantalla SDL_Rect window = {0, 0, SCREEN_WIDTH, SCREEN_HEIGHT}; SDL_Rect srcRect = {0, 0, 16, 16}; const color_t orangeColor = {0xFF, 0x7A, 0x00}; const SDL_Rect destRect1 = {60, 88 + (16 * 0), 16, 16}; // Disquito const SDL_Rect destRect2 = {60, 88 + (16 * 1), 16, 16}; // Gavineixon const SDL_Rect destRect3 = {60, 88 + (16 * 2), 16, 16}; // Pacmar const SDL_Rect destRect4 = {60, 88 + (16 * 3), 16, 16}; // Time Stopper const SDL_Rect destRect5 = {60, 88 + (16 * 4), 16, 16}; // Coffee // Pinta en el backbuffer el texto y los sprites SDL_SetRenderTarget(mRenderer, mBackbuffer); SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 255); SDL_RenderClear(mRenderer); // Escribe el texto mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 8, "OBJECTIVE", 0, orangeColor, 1, shdwTxtColor); mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 24, "YOU HAVE TO POP AS MANY", 0, noColor, 1, shdwTxtColor); mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 34, "BALLOONS AS YOU CAN", 0, noColor, 1, shdwTxtColor); mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 48, "DIFFICULTY WILL BE INCREASED", 0, noColor, 1, shdwTxtColor); mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 58, "AS YOU SCORE POINTS", 0, noColor, 1, shdwTxtColor); mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, 75, "ITEMS", 0, orangeColor, 1, shdwTxtColor); mText->writeShadowed(84, 92, "1.000 POINTS", shdwTxtColor); mText->writeShadowed(84, 108, "2.500 POINTS", shdwTxtColor); mText->writeShadowed(84, 124, "5.000 POINTS", shdwTxtColor); mText->writeShadowed(84, 140, "TIME STOPPER", shdwTxtColor); mText->writeShadowed(84, 156, "EXTRA HIT", shdwTxtColor); if ((mode == INSTRUCTIONS_MODE_MANUAL) && (mCounter % 50 > 14)) mText->writeDX(TXT_CENTER | TXT_COLOR | TXT_SHADOW, SCREEN_CENTER_X, SCREEN_HEIGHT - 12, "PRESS ANY KEY TO RETURN", 0, orangeColor, 1, shdwTxtColor); // Disquito mSprite->init(destRect1, mItemTexture, mRenderer); srcRect.x = 0; srcRect.y = 16 * (((mCounter + 12) / 36) % 2); mSprite->setSpriteClip(srcRect); mSprite->render(); // Gavineixon mSprite->init(destRect2, mItemTexture, mRenderer); srcRect.x += srcRect.w; srcRect.y = 16 * (((mCounter + 9) / 36) % 2); mSprite->setSpriteClip(srcRect); mSprite->render(); // Pacmar mSprite->init(destRect3, mItemTexture, mRenderer); srcRect.x += srcRect.w; srcRect.y = 16 * (((mCounter + 6) / 36) % 2); mSprite->setSpriteClip(srcRect); mSprite->render(); // Time Stopper mSprite->init(destRect4, mItemTexture, mRenderer); srcRect.x += srcRect.w; srcRect.y = 16 * (((mCounter + 3) / 36) % 2); mSprite->setSpriteClip(srcRect); mSprite->render(); // Coffee mSprite->init(destRect5, mItemTexture, mRenderer); srcRect.x += (srcRect.w * 2); // Se salta el icono del TNT srcRect.y = 16 * (((mCounter + 0) / 36) % 2); mSprite->setSpriteClip(srcRect); mSprite->render(); // Cambia el destino de renderizado SDL_SetRenderTarget(mRenderer, nullptr); // Limpia el renderizador SDL_SetRenderDrawColor(mRenderer, bgColor.r, bgColor.g, bgColor.b, 255); SDL_RenderClear(mRenderer); // Establece la ventana del backbuffer if (mode == INSTRUCTIONS_MODE_AUTO) window.y = std::max(8, SCREEN_HEIGHT - mCounter + 100); else window.y = 0; // Copia el backbuffer al renderizador SDL_RenderCopy(mRenderer, mBackbuffer, NULL, &window); // Dibuja el renderizador en pantalla SDL_RenderPresent(mRenderer); } }