210 lines
5.3 KiB
C++
210 lines
5.3 KiB
C++
#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);
|
|
} |