#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; counterEnabled = true; subCounter = 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({"", stringToColor("white")}); texts.push_back({"INSTRUCTIONS:", stringToColor("yellow")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"HELP JAILDOC TO GET BACK ALL HIS", stringToColor("white")}); texts.push_back({"PROJECTS AND GO TO THE JAIL TO", stringToColor("white")}); texts.push_back({"FINISH THEM", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"KEYS:", stringToColor("yellow")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"USE CURSORS TO MOVE AND JUMP", stringToColor("white")}); texts.push_back({"F1-F4 TO CHANGE WINDOWS SIZE", stringToColor("white")}); texts.push_back({"F TO SWITCH TO FULLSCREEN", stringToColor("white")}); texts.push_back({"B TO DE/ACTIVATE THE BORDER SC.", stringToColor("white")}); texts.push_back({"M TO TURN ON/OFF THE MUSIC", stringToColor("white")}); texts.push_back({"ESC TO EXIT GAME", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"A GAME BY JAILDESIGNER", stringToColor("yellow")}); texts.push_back({"MADE ON SUMMER/FALL 2022", stringToColor("yellow")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); texts.push_back({"LOVE JAILGAMES!}", stringToColor("white")}); texts.push_back({"", stringToColor("white")}); // 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; default: section.name = SECTION_PROG_TITLE; section.subsection = 0; break; } } } } // Escribe el texto en la textura void Credits::fillTexture() { // Rellena la textura de texto SDL_SetRenderTarget(renderer, textTexture); const color_t c = stringToColor("black"); SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0x00); SDL_RenderClear(renderer); // Escribe el texto en la textura const int size = text->getCharacterSize(); int i = 0; for (auto t : texts) { text->writeDX(TXT_CENTER | TXT_COLOR, PLAY_AREA_CENTER_X, i * size, t.label, 1, t.color); i++; } SDL_SetRenderTarget(renderer, nullptr); // Rellena la textura que cubre el texto SDL_SetRenderTarget(renderer, coverTexture); SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 0x00); SDL_RenderClear(renderer); // Los primeros 8 pixels crea una malla SDL_SetRenderDrawColor(renderer, c.r, c.g, c.b, 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 el contador void Credits::updateCounter() { // Incrementa el contador if (counterEnabled) { counter++; if (counter == 224 || counter == 544 || counter == 672) { counterEnabled = false; } } else { subCounter++; if (subCounter == 100) { counterEnabled = true; subCounter = 0; } } // Comprueba si ha terminado la sección if (counter > 1000) { section.name = SECTION_PROG_DEMO; } } // 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(); // Actualiza el contador updateCounter(); } } // 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 / 8, 192 / 2); SDL_Rect rect = {0, offset * 2, 256, 192}; SDL_RenderCopy(renderer, coverTexture, nullptr, &rect); // text->write(0,0,std::to_string(counter)); // text->write(0,8,std::to_string(counterEnabled)); // 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; }