#include "const.h"
#include "spriteanimated.h"

#include <iostream>

//Constructor
SpriteAnimated::SpriteAnimated()
{
	init();
}

//Iniciador
void SpriteAnimated::init()
{
	for (Uint8 i = 0; i < 20; i++)
	{
		mAnimation[i].numFrames = 0;
		mAnimation[i].speed = 0;
		for (Uint8 j = 0; i < 20; i++)
		{
			mAnimation[i].frames[j].x = 0;
			mAnimation[i].frames[j].y = 0;
			mAnimation[i].frames[j].w = 0;
			mAnimation[i].frames[j].h = 0;
		}
	}
	mCurrentFrame = 0;
	mAnimationCounter = 0;
}

//Calcula el frame correspondiente a la animación
void SpriteAnimated::animate(int index)
{
	//Calculamos el frame actual a partir del contador
	mCurrentFrame = mAnimationCounter / mAnimation[index].speed;

	//Si alcanzamos el final de la animación, reiniciamos el contador de la animación
	if (mCurrentFrame >= mAnimation[index].numFrames)
	{
		mAnimationCounter = 0;
	}
	//En caso contrario
	else
	{
		//Escogemos el frame correspondiente de la animación
		setSpriteClip(mAnimation[index].frames[mCurrentFrame]);
		
		//Incrementamos el contador de la animacion
		++mAnimationCounter;
	}
}

//Establece el frame actual de la animación
void SpriteAnimated::setCurrentFrame(Uint8 num)
{
	mCurrentFrame = num;
}

//Establece el numero de frames de la animacion
void SpriteAnimated::setAnimationCounter(Uint16 num)
{
	mAnimationCounter = num;
}

//Establece el rectangulo para un frame de una animación
void SpriteAnimated::setAnimationFrames(Uint8 index_animation, Uint8 index_frame, int x, int y, int w, int h)
{
	mAnimation[index_animation].frames[index_frame].x = x;
	mAnimation[index_animation].frames[index_frame].y = y;
	mAnimation[index_animation].frames[index_frame].w = w;
	mAnimation[index_animation].frames[index_frame].h = h;
}

//Establece la velocidad de una animación
void SpriteAnimated::setAnimationSpeed(Uint8 index, Uint8 speed)
{
	mAnimation[index].speed = speed;
}

//Establece el numero de frames de una animación
void SpriteAnimated::setAnimationNumFrames(Uint8 index, Uint8 num)
{
	mAnimation[index].numFrames = num;
}

//Devuelve el rectangulo de una animación y frame concreto
SDL_Rect SpriteAnimated::getAnimationClip(Uint8 index_animation, Uint8 index_frame)
{
	return mAnimation[index_animation].frames[index_frame];
}