#include "credits.h" // Constructor Credits::Credits(SDL_Renderer *renderer, Screen *screen, Asset *asset) { // Copia la dirección de los objetos this->renderer = renderer; this->screen = screen; this->asset = asset; // Reserva memoria para los punteros eventHandler = new SDL_Event(); text = new Text(asset->get("smb2.png"), asset->get("smb2.txt"), renderer); // Inicializa variables counter = 0; section.name = SECTION_PROG_CREDITS; section.subsection = 0; ticks = 0; ticksSpeed = 15; // Cambia el color del borde screen->setBorderColor(stringToColor("black")); // Inicializa los textos texts.push_back(""); texts.push_back("INSTRUCTIONS:"); texts.push_back(""); texts.push_back("HELP JAILDOC TO GET BACK ALL HIS"); texts.push_back("PROJECTS AND GO TO THE JAIL TO"); texts.push_back("FINISH THEM"); texts.push_back(""); texts.push_back(""); texts.push_back("KEYS:"); texts.push_back(""); texts.push_back("USE CURSORS TO MOVE AND JUMP"); texts.push_back("F1-F4 TO CHANGE WINDOWS SIZE"); texts.push_back("F TO SWITCH TO FULLSCREEN"); texts.push_back("B TO DE/ACTIVATE THE BORDER SC."); texts.push_back("M TO TURN ON/OFF THE MUSIC"); texts.push_back("ESC TO EXIT GAME"); texts.push_back(""); texts.push_back(""); texts.push_back("A GAME BY JAILDESIGNER"); texts.push_back("MADE ON SUMMER/FALL 2022"); texts.push_back(""); texts.push_back(""); texts.push_back("LOVE JAILGAMES!}"); texts.push_back(""); // Crea la textura para el texto que se escribe en pantalla textTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT); if (textTexture == nullptr) { printf("Error: textTexture could not be created!\nSDL Error: %s\n", SDL_GetError()); } SDL_SetTextureBlendMode(textTexture, SDL_BLENDMODE_BLEND); // Crea la textura para cubrir el rexto coverTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET, GAMECANVAS_WIDTH, GAMECANVAS_HEIGHT); if (coverTexture == nullptr) { printf("Error: coverTexture could not be created!\nSDL Error: %s\n", SDL_GetError()); } SDL_SetTextureBlendMode(coverTexture, SDL_BLENDMODE_BLEND); // Escribe el texto en la textura fillTexture(); } // Destructor Credits::~Credits() { delete eventHandler; delete text; SDL_DestroyTexture(textTexture); SDL_DestroyTexture(coverTexture); } // Comprueba el manejador de eventos void Credits::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 = SECTION_PROG_QUIT; break; } // Comprueba si se ha pulsado alguna tecla else if ((eventHandler->type == SDL_KEYDOWN) and (eventHandler->key.repeat == 0)) { switch (eventHandler->key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: section.name = SECTION_PROG_QUIT; break; case SDL_SCANCODE_RETURN: section.name = SECTION_PROG_TITLE; section.subsection = 0; break; default: break; } } } } // Escribe el texto en la textura void Credits::fillTexture() { // Rellena la textura de texto SDL_SetRenderTarget(renderer, textTexture); SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(renderer); // Escribe el texto en la textura const int size = text->getCharacterSize(); int i = 0; for (auto t : texts) { text->write(0, i * size, t); i++; } SDL_SetRenderTarget(renderer, nullptr); // Rellena la textura que cubre el texto SDL_SetRenderTarget(renderer, coverTexture); SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00); SDL_RenderClear(renderer); // Los primeros 8 pixels crea una malla SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0xFF); for (int i = 0; i < 256; i += 2) { SDL_RenderDrawPoint(renderer, i, 0); SDL_RenderDrawPoint(renderer, i, 2); SDL_RenderDrawPoint(renderer, i, 4); SDL_RenderDrawPoint(renderer, i, 6); SDL_RenderDrawPoint(renderer, i + 1, 1); SDL_RenderDrawPoint(renderer, i + 1, 3); SDL_RenderDrawPoint(renderer, i + 1, 5); SDL_RenderDrawPoint(renderer, i + 1, 7); } // El resto se rellena de color SDL_Rect rect = {0, 8, 256, 192}; SDL_RenderFillRect(renderer, &rect); SDL_SetRenderTarget(renderer, nullptr); } // Actualiza las variables void Credits::update() { // Comprueba que la diferencia de ticks sea mayor a la velocidad del juego if (SDL_GetTicks() - ticks > ticksSpeed) { // Actualiza el contador de ticks ticks = SDL_GetTicks(); // Comprueba el manejador de eventos checkEventHandler(); // Incrementa el contador counter++; // Comprueba si ha terminado la sección if (counter > 1000) { section.name = SECTION_PROG_DEMO; } } } // Dibuja en pantalla void Credits::render() { // Prepara para empezar a dibujar en la textura de juego screen->start(); // Limpia la pantalla screen->clean(); // Dibuja la textura con el texto en pantalla SDL_RenderCopy(renderer, textTexture, nullptr, nullptr); // Dibuja la textura que cubre el texto const int offset = std::min(counter / 4, 192 / 2); SDL_Rect rect = {0, offset * 2, 256, 192}; SDL_RenderCopy(renderer, coverTexture, nullptr, &rect); // Vuelca el contenido del renderizador en pantalla screen->blit(); } // Bucle para el logo del juego section_t Credits::run() { while (section.name == SECTION_PROG_CREDITS) { update(); render(); } return section; }