//#include "const.h" #include "animatedsprite.h" //#include // 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; }