Files
volcano_2022/source/animatedsprite.cpp

146 lines
3.5 KiB
C++

//#include "const.h"
#include "animatedsprite.h"
//#include <iostream>
// Constructor
AnimatedSprite::AnimatedSprite()
{
MovingSprite::init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr);
init(nullptr, nullptr);
}
// Destructor
AnimatedSprite::~AnimatedSprite()
{
MovingSprite::init(0, 0, 0, 0, 0, 0, 0, 0, nullptr, nullptr);
init(nullptr, nullptr);
}
// Iniciador
void AnimatedSprite::init(LTexture *texture, SDL_Renderer *renderer)
{
mRenderer = renderer;
mTexture = texture;
for (Uint8 i = 0; i < 20; i++)
{
mAnimation[i].numFrames = 0;
mAnimation[i].speed = 0;
mAnimation[i].loop = true;
mAnimation[i].currentFrame = 0;
mAnimation[i].counter = 0;
for (Uint8 j = 0; i < 50; i++)
{
mAnimation[i].frame[j].x = 0;
mAnimation[i].frame[j].y = 0;
mAnimation[i].frame[j].w = 0;
mAnimation[i].frame[j].h = 0;
}
}
mCurrentAnimation = 0;
}
// Calcula el frame correspondiente a la animación
void AnimatedSprite::animate(int index)
{
// Calculamos el frame actual a partir del contador
mAnimation[index].currentFrame = mAnimation[index].counter / mAnimation[index].speed;
// Final de la animación
if (mAnimation[index].currentFrame >= mAnimation[index].numFrames)
{
// Si se reproduce en bucle
if (mAnimation[index].loop)
{
// Reiniciamos el contador de la animación
mAnimation[index].counter = 0;
}
else
{
// Mantenemos el ultimo frame
mAnimation[index].currentFrame = mAnimation[index].numFrames;
}
}
// La animación no ha llegado a su fin
else
{
// Establece el frame correspondiente de la animación
setSpriteClip(mAnimation[index].frame[mAnimation[index].currentFrame]);
// Incrementa el contador de la animacion
mAnimation[index].counter++;
}
}
// Actualiza todas las variables del objeto: posición, velocidad y animación
void AnimatedSprite::update()
{
MovingSprite::update();
animate(mCurrentAnimation);
}
// Establece el frame actual de la animación
void AnimatedSprite::setCurrentFrame(Uint8 index, Uint8 num)
{
mAnimation[index].currentFrame = num;
}
// Establece el valor del contador
void AnimatedSprite::setAnimationCounter(Uint8 index, Uint16 num)
{
mAnimation[index].counter = num;
}
// Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index, Uint8 frame, int x, int y, int w, int h)
{
mAnimation[index].frame[frame].y = y;
mAnimation[index].frame[frame].w = w;
mAnimation[index].frame[frame].h = h;
mAnimation[index].frame[frame].x = x;
}
// Establece el rectangulo para un frame de una animación
void AnimatedSprite::setAnimationFrames(Uint8 index, Uint8 frame, SDL_Rect rect)
{
mAnimation[index].frame[frame] = rect;
}
// Establece la velocidad de una animación
void AnimatedSprite::setAnimationSpeed(Uint8 index, Uint8 speed)
{
mAnimation[index].speed = speed;
}
// Establece el numero de frames de una animación
void AnimatedSprite::setAnimationNumFrames(Uint8 index, Uint8 num)
{
if (num < MAX_FRAMES)
mAnimation[index].numFrames = num;
}
// Establece si la animación se reproduce en bucle
void AnimatedSprite::setAnimationLoop(Uint8 index, bool loop)
{
mAnimation[index].loop = loop;
}
// Devuelve el rectangulo de una animación y frame concreto
SDL_Rect AnimatedSprite::getAnimationClip(Uint8 index, Uint8 frame)
{
return mAnimation[index].frame[frame];
}
// Establece la animación actual
void AnimatedSprite::setCurrentAnimation(Uint8 index)
{
if (index < MAX_ANIMATIONS)
mCurrentAnimation = index;
}
// Obtiene la animación actual
Uint8 AnimatedSprite::getCurrentAnimation()
{
return mCurrentAnimation;
}