summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/Animation.java11
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/AnimationSequence.java82
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/BounceAnimation.java73
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/TimedAnimation.java49
4 files changed, 215 insertions, 0 deletions
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/Animation.java b/core/src/ch/asynk/gdx/boardgame/animations/Animation.java
new file mode 100644
index 0000000..52c0889
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/Animation.java
@@ -0,0 +1,11 @@
+package ch.asynk.gdx.boardgame.animations;
+
+import com.badlogic.gdx.utils.Disposable;
+
+import ch.asynk.gdx.boardgame.Drawable;
+
+public interface Animation extends Drawable, Disposable
+{
+ public boolean completed();
+ public boolean animate(float delta);
+}
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/AnimationSequence.java b/core/src/ch/asynk/gdx/boardgame/animations/AnimationSequence.java
new file mode 100644
index 0000000..4732c53
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/AnimationSequence.java
@@ -0,0 +1,82 @@
+package ch.asynk.gdx.boardgame.animations;
+
+import com.badlogic.gdx.utils.Pool;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
+
+import ch.asynk.gdx.boardgame.utils.IterableArray;
+
+public class AnimationSequence implements Animation, Pool.Poolable
+{
+ private static final Pool<AnimationSequence> animationSequencePool = new Pool<AnimationSequence>()
+ {
+ @Override protected AnimationSequence newObject()
+ {
+ return new AnimationSequence();
+ }
+ };
+
+ public static AnimationSequence get(int capacity)
+ {
+ AnimationSequence seq = animationSequencePool.obtain();
+ if (seq.animations == null) {
+ seq.animations = new IterableArray<Animation>(capacity);
+ } else {
+ seq.animations.ensureCapacity(capacity);
+ }
+
+ return seq;
+ }
+
+ private IterableArray<Animation> animations;
+
+ private AnimationSequence()
+ {
+ }
+
+ @Override public void reset()
+ {
+ for (Animation a : animations) {
+ a.dispose();
+ }
+ animations.clear();
+ }
+
+ @Override public void dispose()
+ {
+ animationSequencePool.free(this);
+ }
+
+ public void addAnimation(Animation animation)
+ {
+ animations.add(animation);
+ }
+
+ @Override public boolean completed()
+ {
+ return (animations.size() == 0);
+ }
+
+ @Override public boolean animate(float delta)
+ {
+ if (animations.isEmpty()) return true;
+
+ Animation animation = animations.get(0);
+ if (animation.animate(delta)) {
+ animations.remove(0);
+ animation.dispose();
+ }
+
+ return (animations.isEmpty());
+ }
+
+ @Override public void draw(Batch batch)
+ {
+ animations.get(0).draw(batch);
+ }
+
+ @Override public void drawDebug(ShapeRenderer debugShapes)
+ {
+ animations.get(0).drawDebug(debugShapes);
+ }
+}
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/BounceAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/BounceAnimation.java
new file mode 100644
index 0000000..3149e8d
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/BounceAnimation.java
@@ -0,0 +1,73 @@
+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.graphics.glutils.ShapeRenderer;
+
+import ch.asynk.gdx.boardgame.Scalable;
+
+public class BounceAnimation extends TimedAnimation
+{
+ private static final Pool<BounceAnimation> bounceAnimationPool = new Pool<BounceAnimation>()
+ {
+ @Override protected BounceAnimation newObject()
+ {
+ return new BounceAnimation();
+ }
+ };
+
+ public static BounceAnimation get(Scalable scalable, float duration, float bounceFactor)
+ {
+ BounceAnimation a = bounceAnimationPool.obtain();
+
+ a.scalable = scalable;
+ a.duration = duration;
+ a.bounceFactor = bounceFactor;
+
+ return a;
+ }
+
+ private Scalable scalable;
+ private float bounceFactor;
+
+ private BounceAnimation()
+ {
+ }
+
+ public BounceAnimation(Scalable scalable, float duration, float bounceFactor)
+ {
+ this.scalable = scalable;
+ this.duration = duration;
+ this.bounceFactor = bounceFactor;
+ }
+
+ @Override public void dispose()
+ {
+ bounceAnimationPool.free(this);
+ }
+
+ @Override protected void begin()
+ {
+ }
+
+ @Override protected void end()
+ {
+ scalable.setScale(1f);
+ }
+
+ @Override protected void update(float percent)
+ {
+ scalable.setScale(1 + bounceFactor * (float) Math.sin(percent * Math.PI));
+ }
+
+ @Override public void draw(Batch batch)
+ {
+ scalable.draw(batch);
+ }
+
+ @Override public void drawDebug(ShapeRenderer debugShapes)
+ {
+ }
+}
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/TimedAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/TimedAnimation.java
new file mode 100644
index 0000000..f66cb98
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/TimedAnimation.java
@@ -0,0 +1,49 @@
+package ch.asynk.gdx.boardgame.animations;
+
+import com.badlogic.gdx.utils.Pool;
+
+public abstract class TimedAnimation implements Animation, Pool.Poolable
+{
+ private float time;
+ private boolean started;
+ private boolean completed;
+ protected float duration;
+
+ abstract protected void begin();
+ abstract protected void end();
+ abstract protected void update(float percent);
+
+ @Override public void reset()
+ {
+ time = 0f;
+ started = false;
+ completed = false;
+ }
+
+ @Override public boolean completed()
+ {
+ return completed;
+ }
+
+ @Override public boolean animate(float delta)
+ {
+ if (completed) return true;
+
+ if (!started) {
+ begin();
+ started = true;
+ }
+
+ time += delta;
+
+ if (time >= duration) {
+ completed = true;
+ update(1);
+ end();
+ } else {
+ update(time / duration);
+ }
+
+ return completed;
+ }
+}