Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Sencillo sistema de animaciones para sprites

Iniciado por Manu343726, 13 de Febrero de 2013, 08:40:26 PM

« anterior - próximo »

Manu343726

Buenas

Estaba pensando en una manera eficiente de hacer animaciones sencillas para sprites. Basicamente cambiar la textura del sprite una vez por "tick", seleccionando esa textura de la lista de texturas que forman la animación.

Algo así:

class AnimatedSprite
{
private:
static void _timerHook();

int _framesCount_1;
Texture _frames[_framesCount_1 + 1];
int _frame;
public:
static const MAXANIMATIONFRAMES = 1000;
void tick();
void draw(GraphicsDevice gfx);
}

void AnimatedSprite::_timerHook()
{
foreach(AnimatedSprite instance : instances)
instance.tick();
}

void AnimatedSprite::tick()
{
if(_frame<_framesCount)
             _frame++;
        else
             _frame=0;
}

void AnimatedSprite::draw(GraphicsDevice gfx)
{
gfx.DrawTexture(_frames[_frame]);
}

(Se supone que es un ejemplo, una especie de C++ en pseudocódigo)
El único detalle es que utiliza el mismo timer para todas las instancias, de manera que la velocidad de la animación sea la misma. Me parecía lo más correcto.

Os parece la mejor manera de implementar animaciones? O usáis alguna forma más eficiente?

PD: También se me había ocurrido una manera para reducir el número de operaciones:

class AnimatedSprite
{
private:
static _tickCounter;
static void _timerHook();

int _framesCount_1;
Texture _frames[_framesCount_1 + 1];
int _frame;
public:
static const MAXANIMATIONFRAMES = 1024;
void tick();
void draw(GraphicsDevice gfx);
}

void AnimatedSprite::_timerHook()
{
if(_tickCounter <= MAXANIMATIONFRAMES)
_tickCounter++;
else
_tickCounter = 0;

foreach(AnimatedSprite instance : instances)
instance.tick();
}

void AnimatedSprite::tick()
{
_frame = MAXANIMATIONFRAMES & _framesCount_1
}

void AnimatedSprite::draw(GraphicsDevice gfx)
{
gfx.DrawTexture(_frames[_frame]);
}


Suponiendo que el número de frames de una animación siempre es potencia de dos. (Un poco chorra, lo se, al final es n sumas vs 1 suma y n ands, supongo que en el hardware de hoy en día será imperceptible la diferencia de rendimiento entre una and y una suma)

zunou

Normalmente se usa una unica textura con todos los sprites, y luego se va recorriendo, es un poco más complicado pero al menos no hay que cargar una textura por frame, es mas eficiente :)

Manu343726







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.