package Roguelike.Sprite.SpriteAnimation; import Roguelike.Global; import com.badlogic.gdx.math.MathUtils; import com.badlogic.gdx.utils.XmlReader.Element; public class MoveAnimation extends AbstractSpriteAnimation { public enum MoveEquation { LINEAR, SMOOTHSTEP, EXPONENTIAL, LEAP } private int[] diff; private MoveEquation eqn; public int leapHeight = 3; private int[] offset = { 0, 0 }; public MoveAnimation() { } public MoveAnimation( float duration, int[] diff, MoveEquation eqn ) { duration *= Global.AnimationSpeed; this.duration = duration; this.diff = diff; this.eqn = eqn; } @Override public boolean update( float delta ) { time += delta; float alpha = MathUtils.clamp( ( duration - time ) / duration, 0, 1 ); if ( eqn == MoveEquation.SMOOTHSTEP ) { alpha = alpha * alpha * ( 3 - 2 * alpha ); // smoothstep } else if ( eqn == MoveEquation.EXPONENTIAL ) { alpha = 1 - ( 1 - alpha ) * ( 1 - alpha ) * ( 1 - alpha ) * ( 1 - alpha ); } offset[0] = (int) ( diff[0] * alpha ); offset[1] = (int) ( diff[1] * alpha ); if ( eqn == MoveEquation.LEAP ) { // B2(t) = (1 - t) * (1 - t) * p0 + 2 * (1-t) * t * p1 + t*t*p2 alpha = ( 1 - alpha ) * ( 1 - alpha ) * 0 + 2 * ( 1 - alpha ) * alpha * 1 + alpha * alpha * 0; offset[1] += ( Global.TileSize * leapHeight ) * alpha; } return time > duration; } @Override public int[] getRenderOffset() { return offset; } @Override public float[] getRenderScale() { return null; } @Override public void set( float duration, int[] diff ) { this.duration = duration; this.time = 0; this.diff = diff; } @Override public void parse( Element xml ) { eqn = MoveEquation.valueOf( xml.get( "Equation", "SmoothStep" ).toUpperCase() ); leapHeight = xml.getInt( "LeapHeight", leapHeight ); } @Override public AbstractSpriteAnimation copy() { MoveAnimation anim = new MoveAnimation(); anim.eqn = eqn; anim.leapHeight = leapHeight; anim.duration = duration; anim.diff = diff; return anim; } }