From abab7886b47873cec83f064625e11f5eac8d205e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Zurcher?= Date: Fri, 19 Sep 2014 09:43:27 +0200 Subject: add engine/gfx to replate scene2d usage --- .../tankontank/engine/gfx/AbstractDrawable.java | 89 ++++++++++++++++++++++ .../ch/asynk/tankontank/engine/gfx/Animation.java | 10 +++ .../ch/asynk/tankontank/engine/gfx/Drawable.java | 29 +++++++ core/src/ch/asynk/tankontank/engine/gfx/Node.java | 14 ++++ .../tankontank/engine/gfx/TextureDrawable.java | 39 ++++++++++ .../engine/gfx/TextureRegionDrawable.java | 29 +++++++ .../engine/gfx/animations/AnimationSequence.java | 68 +++++++++++++++++ .../engine/gfx/animations/MoveToAnimation.java | 74 ++++++++++++++++++ .../engine/gfx/animations/RunnableAnimation.java | 57 ++++++++++++++ .../engine/gfx/animations/TimedAnimation.java | 47 ++++++++++++ 10 files changed, 456 insertions(+) create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/AbstractDrawable.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/Animation.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/Drawable.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/Node.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/TextureDrawable.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/TextureRegionDrawable.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/animations/AnimationSequence.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/animations/MoveToAnimation.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/animations/RunnableAnimation.java create mode 100644 core/src/ch/asynk/tankontank/engine/gfx/animations/TimedAnimation.java 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 animations; + + private static final Pool animationSequencePool = new Pool() { + @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(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 moveToAnimationPool = new Pool() { + @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 runnableAnimationPool = new Pool() { + @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; + } +} -- cgit v1.1-2-g2b99