#include "game_logo.h" // Constructor GameLogo::GameLogo(SDL_Renderer *renderer, Screen *screen, Asset *asset, param_t *param, int x, int y) { // Copia los punteros this->renderer = renderer; this->screen = screen; this->asset = asset; this->param = param; this->x = x; this->y = y; // Crea los objetos dustTexture = new Texture(renderer, asset->get("title_dust.png")); coffeeTexture = new Texture(renderer, asset->get("title_coffee.png")); crisisTexture = new Texture(renderer, asset->get("title_crisis.png")); coffeeBitmap = new SmartSprite(coffeeTexture, renderer); crisisBitmap = new SmartSprite(crisisTexture, renderer); dustBitmapL = new AnimatedSprite(dustTexture, renderer, asset->get("title_dust.ani")); dustBitmapR = new AnimatedSprite(dustTexture, renderer, asset->get("title_dust.ani")); // Sonidos crashSound = JA_LoadSound(asset->get("title.wav").c_str()); // Inicializa las variables init(); } // Destructor GameLogo::~GameLogo() { dustTexture->unload(); delete dustTexture; coffeeTexture->unload(); delete coffeeTexture; crisisTexture->unload(); delete crisisTexture; delete coffeeBitmap; delete crisisBitmap; delete dustBitmapL; delete dustBitmapR; JA_DeleteSound(crashSound); } // Inicializa las variables void GameLogo::init() { const int xp = x - coffeeBitmap->getWidth() / 2; const int desp = getInitialVerticalDesp(); // Variables status = disabled; shake.desp = 1; shake.delay = 3; shake.lenght = 8; shake.remaining = shake.lenght; shake.counter = shake.delay; shake.origin = xp; // Inicializa el bitmap de 'Coffee' coffeeBitmap->init(); coffeeBitmap->setPosX(xp); coffeeBitmap->setPosY(y - coffeeBitmap->getHeight() - desp); coffeeBitmap->setWidth(167); coffeeBitmap->setHeight(46); coffeeBitmap->setVelX(0.0f); coffeeBitmap->setVelY(2.5f); coffeeBitmap->setAccelX(0.0f); coffeeBitmap->setAccelY(0.1f); coffeeBitmap->setSpriteClip(0, 0, 167, 46); coffeeBitmap->setEnabled(true); coffeeBitmap->setEnabledCounter(0); coffeeBitmap->setDestX(xp); coffeeBitmap->setDestY(y - coffeeBitmap->getHeight()); // Inicializa el bitmap de 'Crisis' crisisBitmap->init(); crisisBitmap->setPosX(xp + 15); crisisBitmap->setPosY(y + desp); crisisBitmap->setWidth(137); crisisBitmap->setHeight(46); crisisBitmap->setVelX(0.0f); crisisBitmap->setVelY(-2.5f); crisisBitmap->setAccelX(0.0f); crisisBitmap->setAccelY(-0.1f); crisisBitmap->setSpriteClip(0, 0, 137, 46); crisisBitmap->setEnabled(true); crisisBitmap->setEnabledCounter(0); crisisBitmap->setDestX(xp + 15); crisisBitmap->setDestY(y); // Inicializa el bitmap de 'DustRight' dustBitmapR->resetAnimation(); dustBitmapR->setPosX(coffeeBitmap->getPosX() + coffeeBitmap->getWidth()); dustBitmapR->setPosY(y); dustBitmapR->setWidth(16); dustBitmapR->setHeight(16); dustBitmapR->setFlip(SDL_FLIP_HORIZONTAL); // Inicializa el bitmap de 'DustLeft' dustBitmapL->resetAnimation(); dustBitmapL->setPosX(coffeeBitmap->getPosX() - 16); dustBitmapL->setPosY(y); dustBitmapL->setWidth(16); dustBitmapL->setHeight(16); } // Pinta la clase en pantalla void GameLogo::render() { // Dibuja el logo coffeeBitmap->render(); crisisBitmap->render(); // Dibuja el polvillo del logo dustBitmapR->render(); dustBitmapL->render(); } // Actualiza la lógica de la clase void GameLogo::update() { if (status == moving) { coffeeBitmap->update(); crisisBitmap->update(); // Si los objetos han llegado a su destino, cambiamos de Sección if (coffeeBitmap->hasFinished() && crisisBitmap->hasFinished()) { status = shaking; // Pantallazo blanco screen->flash(flashColor, 5); // Reproduce el efecto sonoro JA_PlaySound(crashSound); } } else if (status == shaking) { // Agita el logo if (shake.remaining > 0) { if (shake.counter > 0) { shake.counter--; } else { shake.counter = shake.delay; const int desp = shake.remaining % 2 == 0 ? shake.desp * (-1) : shake.desp; coffeeBitmap->setPosX(shake.origin + desp); crisisBitmap->setPosX(shake.origin + desp + 15); shake.remaining--; } } else { coffeeBitmap->setPosX(shake.origin); crisisBitmap->setPosX(shake.origin + 15); status = finished; } dustBitmapR->update(); dustBitmapL->update(); } else if (status == finished) { dustBitmapR->update(); dustBitmapL->update(); } } // Activa la clase void GameLogo::enable() { init(); status = moving; } // Indica si ha terminado la animación bool GameLogo::hasFinished() { return (status == finished); } // Recarga las texturas void GameLogo::reLoad() { dustTexture->reLoad(); coffeeTexture->reLoad(); crisisTexture->reLoad(); } // Calcula el desplazamiento vertical inicial int GameLogo::getInitialVerticalDesp() { int despUp = y; int despDown = param->gameHeight - y; return std::max(despUp, despDown); }