summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2014-09-19 09:43:27 +0200
committerJérémy Zurcher <jeremy@asynk.ch>2014-09-19 09:43:27 +0200
commitabab7886b47873cec83f064625e11f5eac8d205e (patch)
treeb490d5eea28fea1fba7f04293b41fa3df1326143
parent127dd3f7518ada1598adc176585ee7151d4ba7be (diff)
downloadRustAndDust-abab7886b47873cec83f064625e11f5eac8d205e.zip
RustAndDust-abab7886b47873cec83f064625e11f5eac8d205e.tar.gz
add engine/gfx to replate scene2d usage
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/AbstractDrawable.java89
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/Animation.java10
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/Drawable.java29
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/Node.java14
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/TextureDrawable.java39
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/TextureRegionDrawable.java29
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/animations/AnimationSequence.java68
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/animations/MoveToAnimation.java74
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/animations/RunnableAnimation.java57
-rw-r--r--core/src/ch/asynk/tankontank/engine/gfx/animations/TimedAnimation.java47
10 files changed, 456 insertions, 0 deletions
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/AbstractDrawable.java b/core/src/ch/asynk/tankontank/engine/gfx/AbstractDrawable.java
new file mode 100644
index 0000000..5d4705c
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/AbstractDrawable.java
@@ -0,0 +1,89 @@
+package ch.asynk.tankontank.engine.gfx;
+
+import com.badlogic.gdx.graphics.Color;
+
+public abstract class AbstractDrawable implements Drawable
+{
+ protected float w;
+ protected float h;
+ protected float x;
+ protected float y;
+ protected int r;
+ protected float s;
+ protected Color color;
+
+ public AbstractDrawable()
+ {
+ this.w = 0f;
+ this.h = 0f;
+ this.x = 0f;
+ this.y = 0f;
+ this.r = 0;
+ this.s = 1f;
+ this.color = new Color(1, 1, 1, 1);
+ }
+
+ @Override
+ public float getWidth()
+ {
+ return w;
+ }
+
+ @Override
+ public float getHeight()
+ {
+ return h;
+ }
+
+ @Override
+ public float getX()
+ {
+ return x;
+ }
+
+ @Override
+ public float getY()
+ {
+ return y;
+ }
+
+ @Override
+ public int getRotation()
+ {
+ return r;
+ }
+
+ @Override
+ public void setRotation(int r)
+ {
+ this.r = r;
+ }
+
+ @Override
+ public void setScale(float s)
+ {
+ this.s = s;
+ }
+
+ @Override
+ public void setPosition(float x, float y)
+ {
+ this.x = x;
+ this.y = y;
+ }
+
+ @Override
+ public void moveBy(float dx, float dy)
+ {
+ this.x += dx;
+ this.y += dy;
+ }
+
+ @Override
+ public void setCoords(float x, float y, int r)
+ {
+ this.x = x;
+ this.y = y;
+ this.r = r;
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/Animation.java b/core/src/ch/asynk/tankontank/engine/gfx/Animation.java
new file mode 100644
index 0000000..6d79046
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/Animation.java
@@ -0,0 +1,10 @@
+package ch.asynk.tankontank.engine.gfx;
+
+public interface Animation
+{
+ public Node getNode();
+
+ public boolean act(float delta);
+
+ public void free();
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/Drawable.java b/core/src/ch/asynk/tankontank/engine/gfx/Drawable.java
new file mode 100644
index 0000000..8b700df
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/Drawable.java
@@ -0,0 +1,29 @@
+package ch.asynk.tankontank.engine.gfx;
+
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.utils.Disposable;
+
+public interface Drawable extends Disposable
+{
+ public float getWidth();
+
+ public float getHeight();
+
+ public float getX();
+
+ public float getY();
+
+ public int getRotation();
+
+ public void setRotation(int r);
+
+ public void setScale(float s);
+
+ public void setPosition(float x, float y);
+
+ public void moveBy(float dx, float dy);
+
+ public void setCoords(float x, float y, int r);
+
+ public void draw(Batch batch, float parentAlpha);
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/Node.java b/core/src/ch/asynk/tankontank/engine/gfx/Node.java
new file mode 100644
index 0000000..4c94e50
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/Node.java
@@ -0,0 +1,14 @@
+package ch.asynk.tankontank.engine.gfx;
+
+import com.badlogic.gdx.graphics.g2d.Batch;
+
+import ch.asynk.tankontank.engine.Layer;
+
+public interface Node extends Drawable
+{
+ public void act(float delta);
+
+ public void clear();
+
+ public void setLayer(Layer layer);
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/TextureDrawable.java b/core/src/ch/asynk/tankontank/engine/gfx/TextureDrawable.java
new file mode 100644
index 0000000..3803d15
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/TextureDrawable.java
@@ -0,0 +1,39 @@
+package ch.asynk.tankontank.engine.gfx;
+
+import com.badlogic.gdx.Gdx;
+
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.Batch;
+
+public class TextureDrawable extends AbstractDrawable
+{
+ private Texture texture;
+
+ public TextureDrawable(Texture texture)
+ {
+ this.texture = texture;
+ this.w = texture.getWidth();
+ this.h = texture.getHeight();
+ }
+
+ @Override
+ public void dispose()
+ {
+ texture.dispose();
+ }
+
+ @Override
+ public void draw(Batch batch, float parentAlpha)
+ {
+ batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
+
+ if (r != 0f)
+ batch.draw(texture, x, y, (w / 2f), (h / 2f), w, h, s, s, r, (int) x, (int) y, (int) w, (int) h, false, false);
+ else {
+ if (s == 1f)
+ batch.draw(texture, x, y);
+ else
+ batch.draw(texture, x, y, getWidth() * s, getHeight() * s);
+ }
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/TextureRegionDrawable.java b/core/src/ch/asynk/tankontank/engine/gfx/TextureRegionDrawable.java
new file mode 100644
index 0000000..afb54d9
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/TextureRegionDrawable.java
@@ -0,0 +1,29 @@
+package ch.asynk.tankontank.engine.gfx;
+
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.graphics.g2d.TextureRegion;
+
+public class TextureRegionDrawable extends AbstractDrawable
+{
+ private TextureRegion region;
+
+ public TextureRegionDrawable(TextureRegion region)
+ {
+ this.region = region;
+ this.w = region.getRegionWidth();
+ this.h = region.getRegionHeight();
+ }
+
+ @Override
+ public void dispose()
+ {
+ }
+
+ @Override
+ public void draw(Batch batch, float parentAlpha)
+ {
+ batch.setColor(color.r, color.g, color.b, color.a * parentAlpha);
+
+ batch.draw(region, x, y, (w / 2f), (h / 2f), w, h, s, s, r, true);
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/animations/AnimationSequence.java b/core/src/ch/asynk/tankontank/engine/gfx/animations/AnimationSequence.java
new file mode 100644
index 0000000..69a9c7a
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/AnimationSequence.java
@@ -0,0 +1,68 @@
+package ch.asynk.tankontank.engine.gfx.animations;
+
+import java.util.Vector;
+
+import com.badlogic.gdx.utils.Pool;
+
+import ch.asynk.tankontank.engine.gfx.Node;
+import ch.asynk.tankontank.engine.gfx.Animation;
+
+public class AnimationSequence implements Animation, Pool.Poolable
+{
+ private Vector<Animation> animations;
+
+ 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 Vector<Animation>(capacity);
+ else
+ seq.animations.setSize(capacity);
+
+ return seq;
+ }
+
+ @Override
+ public void reset()
+ {
+ for (int i = 0, n = animations.size(); i < n; i++)
+ animations.get(i).free();
+ animations.clear();
+ }
+
+ @Override
+ public void free()
+ {
+ animationSequencePool.free(this);
+ }
+
+ @Override
+ public Node getNode()
+ {
+ return animations.get(0).getNode();
+ }
+
+ public void addAnimation(Animation animation)
+ {
+ animations.add(animation);
+ }
+
+ public boolean act(float delta)
+ {
+ if(animations.isEmpty()) return true;
+
+ Animation animation = animations.get(0);
+ if (animation.act(delta)) {
+ animations.removeElementAt(0);
+ }
+
+ return (animations.isEmpty());
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/animations/MoveToAnimation.java b/core/src/ch/asynk/tankontank/engine/gfx/animations/MoveToAnimation.java
new file mode 100644
index 0000000..d95e33a
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/MoveToAnimation.java
@@ -0,0 +1,74 @@
+package ch.asynk.tankontank.engine.gfx.animations;
+
+import com.badlogic.gdx.math.Vector3;
+import com.badlogic.gdx.utils.Pool;
+
+import ch.asynk.tankontank.engine.gfx.Node;
+
+public class MoveToAnimation extends TimedAnimation
+{
+ private Node node;
+ private float fromX;
+ private float fromY;
+ private float fromR;
+ private float toX;
+ private float toY;
+ private float toR;
+
+ private static final Pool<MoveToAnimation> moveToAnimationPool = new Pool<MoveToAnimation>() {
+ @Override
+ protected MoveToAnimation newObject() {
+ return new MoveToAnimation();
+ }
+ };
+
+ @Override
+ public Node getNode()
+ {
+ return node;
+ }
+
+ @Override
+ public void free()
+ {
+ moveToAnimationPool.free(this);
+ }
+
+ public static MoveToAnimation get(Node node, Vector3 v, float duration)
+ {
+ return get(node, v.x, v.y, v.z, duration);
+ }
+
+ public static MoveToAnimation get(Node node, float x, float y, float r, float duration)
+ {
+ MoveToAnimation a = moveToAnimationPool.obtain();
+
+ a.node = node;
+ a.toX = x;
+ a.toY = y;
+ a.toR = r;
+ a.duration = duration;
+
+ return a;
+ }
+
+ protected void begin()
+ {
+ fromX = node.getX();
+ fromY = node.getY();
+ fromR = node.getRotation();
+ }
+
+ protected void end()
+ {
+ free();
+ }
+
+ protected void update(float percent)
+ {
+ if (percent == 1f)
+ node.setCoords(toX, toY, (int) toR);
+ else
+ node.setCoords(fromX + ((toX - fromX) * percent), fromY + ((toY - fromY) * percent), (int) (fromR + ((toR - fromR) * percent)));
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/animations/RunnableAnimation.java b/core/src/ch/asynk/tankontank/engine/gfx/animations/RunnableAnimation.java
new file mode 100644
index 0000000..5a4f235
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/RunnableAnimation.java
@@ -0,0 +1,57 @@
+package ch.asynk.tankontank.engine.gfx.animations;
+
+import com.badlogic.gdx.utils.Pool;
+
+import ch.asynk.tankontank.engine.gfx.Node;
+import ch.asynk.tankontank.engine.gfx.Animation;
+
+public class RunnableAnimation implements Animation, Pool.Poolable
+{
+ private Runnable runnable;
+ private boolean ran;
+
+ private static final Pool<RunnableAnimation> runnableAnimationPool = new Pool<RunnableAnimation>() {
+ @Override
+ protected RunnableAnimation newObject() {
+ return new RunnableAnimation();
+ }
+ };
+
+ public static RunnableAnimation get(Runnable runnable)
+ {
+ RunnableAnimation a = runnableAnimationPool.obtain();
+ a.runnable = runnable;
+ return a;
+ }
+
+ @Override
+ public void reset()
+ {
+ ran = false;
+ }
+
+ @Override
+ public void free()
+ {
+ runnableAnimationPool.free(this);
+ }
+
+ @Override
+ public Node getNode()
+ {
+ return null;
+ }
+
+ @Override
+ public boolean act(float delta)
+ {
+ if (ran) return true;
+
+ runnable.run();
+ runnable = null;
+ ran = true;
+ free();
+
+ return true;
+ }
+}
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/animations/TimedAnimation.java b/core/src/ch/asynk/tankontank/engine/gfx/animations/TimedAnimation.java
new file mode 100644
index 0000000..c7854d0
--- /dev/null
+++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/TimedAnimation.java
@@ -0,0 +1,47 @@
+package ch.asynk.tankontank.engine.gfx.animations;
+
+import com.badlogic.gdx.utils.Pool.Poolable;
+
+import ch.asynk.tankontank.engine.gfx.Animation;
+
+abstract public class TimedAnimation implements Animation, Poolable
+{
+ private float time;
+ private boolean began;
+ private boolean completed;
+ protected float duration;
+
+ @Override
+ public void reset()
+ {
+ time = 0f;
+ began = false;
+ completed = false;
+ }
+
+ abstract protected void begin();
+ abstract protected void end();
+ abstract protected void update(float percent);
+
+ public boolean act(float delta)
+ {
+ if (completed) return true;
+
+ if (!began) {
+ begin();
+ began = true;
+ }
+
+ time += delta;
+ completed = (time >= duration);
+
+ if (!completed) {
+ update(time / duration);
+ return false;
+ }
+
+ update(1);
+ end();
+ return true;
+ }
+}