diff options
| -rw-r--r-- | core/src/ch/asynk/gdx/boardgame/animations/MoveAnimation.java | 111 | 
1 files changed, 111 insertions, 0 deletions
| diff --git a/core/src/ch/asynk/gdx/boardgame/animations/MoveAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/MoveAnimation.java new file mode 100644 index 0000000..27de101 --- /dev/null +++ b/core/src/ch/asynk/gdx/boardgame/animations/MoveAnimation.java @@ -0,0 +1,111 @@ +package ch.asynk.gdx.boardgame.animations; + +import java.lang.Math; + +import com.badlogic.gdx.utils.Pool; +import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.math.Vector3; + +import ch.asynk.gdx.boardgame.pieces.Piece; +import ch.asynk.gdx.boardgame.Path; + +public class MoveAnimation implements Animation, Pool.Poolable +{ +    private static final Pool<MoveAnimation> moveAnimationPool = new Pool<MoveAnimation>() +    { +        @Override protected MoveAnimation newObject() +        { +            return new MoveAnimation(); +        } +    }; + +    public static MoveAnimation obtain(Piece piece, Path path, float speed) +    { +        MoveAnimation a = moveAnimationPool.obtain(); + +        a.piece = piece; +        a.path = path; +        a.speed = speed; + +        a.init(); + +        return a; +    } + +    private Piece piece; +    private Path path; +    private float speed; +    private float dp; +    private float percent; +    private Vector3 dst = new Vector3(); +    private Vector3 dt = new Vector3(); + +    private MoveAnimation() +    { +    } + +    private void init() +    { +        path.iterator(); +        setNextMove(); +        percent = 0f; +        dp = 1f * speed; +    } + +    private boolean setNextMove() +    { +        boolean done = path.nextVector(piece, dst); + +        float dr = (dst.z - piece.getRotation()); +        if (dr > 180) { +            dr -= 360; +        } else if (dr < -180) { +            dr += 360; +        } + +        dt.set( +                (dst.x - piece.getX()) * speed, +                (dst.y - piece.getY()) * speed, +                (dr) * speed +              ); +        return done; +    } + +    @Override public void reset() +    { +        this.path = null; +        this.piece = null; +        this.dst.set(0, 0, 0); +    } + +    @Override public void dispose() +    { +        moveAnimationPool.free(this); +    } + +    @Override public boolean completed() +    { +        return (percent >= 1f); +    } + +    @Override public boolean animate(float delta) +    { +        piece.translate(dt.x * delta, dt.y * delta); +        piece.rotate(dt.z * delta); + +        percent += (dp * delta); +        if (percent >= 1f) { +            piece.setPosition(dst.x, dst.y, dst.z); +            if (!setNextMove()) { +                percent = 0f; +            } +        } + +        return (percent >= 1f); +    } + +    @Override public void draw(Batch batch) +    { +        piece.draw(batch); +    } +} | 
