#include "ending2.h" // Constructor Ending2::Ending2(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options) { // Copia los punteros this->renderer = renderer; this->screen = screen; this->resource = resource; this->asset = asset; this->options = options; // Reserva memoria para los punteros a objetos eventHandler = new SDL_Event(); text = new Text(resource->getOffset("smb2.txt"), resource->getTexture("smb2.png"), renderer); music = JA_LoadMusic(asset->get("ending2.ogg").c_str()); // Inicializa variables counter = -1; preCounter = 0; section.name = SECTION_PROG_ENDING2; section.subsection = 0; ticks = 0; ticksSpeed = 15; // Cambia el color del borde screen->setBorderColor(stringToColor(options->palette, "black")); // Inicializa la lista de sprites iniSpriteList(); // Carga todos los sprites desde una lista loadSprites(); } // Destructor Ending2::~Ending2() { // Libera la memoria de los objetos delete eventHandler; delete text; JA_DeleteMusic(music); for (auto sprite : sprites) { delete sprite; } sprites.clear(); } // Actualiza el objeto void Ending2::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 los contadores updateCounters(); // Actualiza los sprites updateSprites(); if (counter > 4000) { section.name = SECTION_PROG_LOGO; } } } // Dibuja el final en pantalla void Ending2::render() { // Prepara para empezar a dibujar en la textura de juego screen->start(); // Limpia la pantalla screen->clean(stringToColor(options->palette, "black")); // Dibuja los sprites renderSprites(); const std::string txt = std::to_string(preCounter) + " - " + std::to_string(counter) + " - W:" + std::to_string(maxSpriteWidth) + " - H:" + std::to_string(maxSpriteHeight); text->write(0, 192 - 8, txt); // Dibuja la cuadricula { SDL_SetRenderDrawColor(renderer, 128, 128, 128, 255); const int sw = maxSpriteWidth + 6; const int sh = maxSpriteHeight + 6; for (int i = 0; i < (int)sprites.size(); ++i) { const int x = (i * sw) % (256 - sw); const int y = (i / (256 / sw)) * sh; const int w = sprites.at(i)->getAnimationClip(0, 0).w; const int h = sprites.at(i)->getAnimationClip(0, 0).h; sprites.at(i)->setRect({x, y, w, h}); } } // Vuelca el contenido del renderizador en pantalla screen->blit(); } // Comprueba el manejador de eventos void Ending2::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 las teclas que se han pulsado if ((eventHandler->type == SDL_KEYDOWN && eventHandler->key.repeat == 0) || (eventHandler->type == SDL_JOYBUTTONDOWN)) { switch (eventHandler->key.keysym.scancode) { case SDL_SCANCODE_ESCAPE: section.name = SECTION_PROG_QUIT; break; case SDL_SCANCODE_B: screen->switchBorder(); resource->reLoadTextures(); break; case SDL_SCANCODE_F: screen->switchVideoMode(); resource->reLoadTextures(); break; case SDL_SCANCODE_F1: screen->setWindowSize(1); resource->reLoadTextures(); break; case SDL_SCANCODE_F2: screen->setWindowSize(2); resource->reLoadTextures(); break; case SDL_SCANCODE_F3: screen->setWindowSize(3); resource->reLoadTextures(); break; case SDL_SCANCODE_F4: screen->setWindowSize(4); resource->reLoadTextures(); break; case SDL_SCANCODE_F5: // switchPalette(); break; default: break; } } } } // Bucle principal section_t Ending2::run() { // JA_PlayMusic(music); while (section.name == SECTION_PROG_ENDING2) { update(); render(); } // JA_StopMusic(); return section; } // Actualiza los contadores void Ending2::updateCounters() { // Incrementa el contador if (preCounter < 20) { preCounter++; } else { counter++; } } // Inicializa la lista de sprites void Ending2::iniSpriteList() { // Reinicia el vector spriteList.clear(); // Añade los valores spriteList.push_back("abad"); spriteList.push_back("abad_bell"); spriteList.push_back("amstrad_character_set"); spriteList.push_back("arounder_fly"); spriteList.push_back("arounder_stop"); spriteList.push_back("arounder_walk"); spriteList.push_back("arounders_door"); spriteList.push_back("arounders_machine"); spriteList.push_back("bat"); spriteList.push_back("batman_bell"); spriteList.push_back("batman_fire"); spriteList.push_back("batman"); spriteList.push_back("bell"); spriteList.push_back("bin"); spriteList.push_back("bird"); spriteList.push_back("breakout"); spriteList.push_back("bry"); spriteList.push_back("chip"); spriteList.push_back("code"); spriteList.push_back("demon"); spriteList.push_back("dimallas_v"); spriteList.push_back("dimallas"); spriteList.push_back("diskette"); spriteList.push_back("dong"); spriteList.push_back("heavy"); spriteList.push_back("jailbattle_alien"); spriteList.push_back("jailbattle_human"); spriteList.push_back("jailer"); spriteList.push_back("jailer2"); spriteList.push_back("jailer3"); spriteList.push_back("lamp"); spriteList.push_back("macaronni_ted"); spriteList.push_back("matatunos"); spriteList.push_back("mummy"); spriteList.push_back("paco"); spriteList.push_back("printer"); spriteList.push_back("qvoid"); spriteList.push_back("sam"); spriteList.push_back("sigmasua"); spriteList.push_back("spider"); spriteList.push_back("tuno"); spriteList.push_back("tv_panel"); spriteList.push_back("tv"); spriteList.push_back("wave_v"); spriteList.push_back("wave"); } // Carga todos los sprites desde una lista void Ending2::loadSprites() { maxSpriteWidth = 0; maxSpriteHeight = 0; for (auto sl : spriteList) { sprites.push_back(new AnimatedSprite(renderer, resource->getAnimation(sl + ".ani"))); maxSpriteWidth = std::max(sprites.back()->getAnimationClip(0, 0).w, maxSpriteWidth); maxSpriteHeight = std::max(sprites.back()->getAnimationClip(0, 0).h, maxSpriteHeight); } const int sw = maxSpriteWidth + 6; const int sh = maxSpriteHeight + 6; for (int i = 0; i < (int)sprites.size(); ++i) { const int x = (i * sw) % (256 - sw); const int y = (i / (256 / sw)) * sh; const int w = sprites.at(i)->getAnimationClip(0, 0).w; const int h = sprites.at(i)->getAnimationClip(0, 0).h; sprites.at(i)->setRect({x, y, w, h}); } } // Actualiza los sprites void Ending2::updateSprites() { for (auto sprite : sprites) { sprite->update(); } } // Dibuja los sprites void Ending2::renderSprites() { const color_t color = stringToColor(options->palette, "red"); for (auto sprite : sprites) { sprite->getTexture()->setColor(color.r, color.g, color.b); sprite->render(); sprite->getTexture()->setColor(255, 255, 255); } }