Files
coffee_crisis_arcade_edition/source/game_logo.cpp

209 lines
5.3 KiB
C++

#include "game_logo.h"
// Constructor
GameLogo::GameLogo(SDL_Renderer *renderer, Screen *screen, Asset *asset, int x, int y)
{
// Copia los punteros
this->renderer = renderer;
this->screen = screen;
this->asset = asset;
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 = GAMECANVAS_HEIGHT - y;
return std::max(despUp, despDown);
}