summaryrefslogtreecommitdiffstats
path: root/core/src/ch/asynk/gdx/boardgame/animations
diff options
context:
space:
mode:
authorJérémy Zurcher <jeremy@asynk.ch>2019-01-15 17:40:51 +0100
committerJérémy Zurcher <jeremy@asynk.ch>2019-01-15 17:40:51 +0100
commitc6011ade66ad9f897b09f44d17c2f40c4d63e3f0 (patch)
treed268b130c858929fd43b8a38cc74ae6183a96a7d /core/src/ch/asynk/gdx/boardgame/animations
parenta676cc05908ac0a5c6471e76c0843e15314972d6 (diff)
downloadgdx-boardgame-c6011ade66ad9f897b09f44d17c2f40c4d63e3f0.zip
gdx-boardgame-c6011ade66ad9f897b09f44d17c2f40c4d63e3f0.tar.gz
ShellFireAnimation -> ShotAnimation and FireAnimation
Diffstat (limited to 'core/src/ch/asynk/gdx/boardgame/animations')
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/FireAnimation.java192
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/ShellFireAnimation.java263
-rw-r--r--core/src/ch/asynk/gdx/boardgame/animations/ShotAnimation.java186
3 files changed, 378 insertions, 263 deletions
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/FireAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/FireAnimation.java
new file mode 100644
index 0000000..1bedb10
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/FireAnimation.java
@@ -0,0 +1,192 @@
+package ch.asynk.gdx.boardgame.animations;
+
+import java.util.Hashtable;
+import java.util.Map;
+
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.Texture;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.math.Vector2;
+import com.badlogic.gdx.utils.Pool;
+
+import ch.asynk.gdx.boardgame.FramedSprite;
+import ch.asynk.gdx.boardgame.Piece;
+
+public class FireAnimation implements Animation, Pool.Poolable
+{
+ public static class Config
+ {
+ public int burstCount;
+ public float burstDelay;
+ public float maxFireDelay;
+ public float maxFireScattering;
+ public float shellSpeed;
+ public float smokeDuration;
+ public float explosionDuration;
+ public FramedSprite shellSprites;
+ public FramedSprite explosionSprites;
+ public Sound shellFireSnd;
+ public Sound explosionSnd;
+ public Config(int burstCount, float burstDelay,
+ float maxFireDelay, float maxFireScattering,
+ float shellSpeed, float smokeDuration, float explosionDuration,
+ FramedSprite shellSprites, FramedSprite explosionSprites,
+ Sound shellFireSnd, Sound explosionSnd)
+ {
+ this.burstCount = burstCount;
+ this.burstDelay = burstDelay;
+ this.maxFireDelay = maxFireDelay;
+ this.maxFireScattering = maxFireScattering;
+ this.shellSpeed = shellSpeed;
+ this.smokeDuration = smokeDuration;
+ this.explosionDuration = explosionDuration;
+ this.shellSprites = shellSprites;
+ this.explosionSprites = explosionSprites;
+ this.shellFireSnd = shellFireSnd;
+ this.explosionSnd = explosionSnd;
+ }
+ }
+
+ private static Map<String, Config> configs = new Hashtable<String, Config>();
+
+ public static void register(final String name,
+ int burstCount,
+ float burstDelay,
+ float maxFireDelay,
+ float maxFireScattering,
+ float shellSpeed,
+ float smokeDuration,
+ float explosionDuration,
+ final Texture shellTexture, int shellR, int shellC,
+ final Texture explosionTexture, int explosionR, int explosionC,
+ final Sound shellFireSnd,
+ final Sound explosionSnd
+ )
+ {
+ Config cfg = new Config(burstCount, burstDelay,
+ maxFireDelay, maxFireScattering,
+ shellSpeed, smokeDuration, (explosionTexture == null ? 0f : explosionDuration),
+ (shellTexture == null ? null : new FramedSprite(shellTexture, shellR, shellC)),
+ (explosionTexture == null ? null : new FramedSprite(explosionTexture, explosionR, explosionC)),
+ shellFireSnd, explosionSnd
+ );
+ configs.put(name, cfg);
+ }
+
+ public static void free()
+ {
+ // for(String key : configs.keySet()) {
+ // Config cfg = configs.get(key);
+ // }
+ configs.clear();
+ }
+
+ private static final Pool<FireAnimation> shellFireAnimationPool = new Pool<FireAnimation>()
+ {
+ @Override protected FireAnimation newObject()
+ {
+ return new FireAnimation();
+ }
+ };
+
+ public static Vector2 sv = new Vector2();
+ public static Vector2 tv = new Vector2();
+ public static FireAnimation obtain(final String configName, Piece shooter, Piece target)
+ {
+ shooter.getFireingPoint(sv, target);
+ target.getImpactPoint(tv);
+ return obtain(configName, sv.x, sv.y, tv.x, tv.y);
+ }
+
+ public static FireAnimation obtain(final String configName, float x0, float y0, float x1, float y1)
+ {
+ FireAnimation a = shellFireAnimationPool.obtain();
+
+ Config cfg = configs.get(configName);
+ if (cfg == null) {
+ throw new RuntimeException(String.format("FireAnimation : no configuration named : '%s'", configName));
+ }
+ a.compute(cfg, x0, y0, x1, y1);
+
+ return a;
+ }
+
+ @Override public void reset()
+ {
+ this.shot = null;
+ this.shots = null;
+ }
+
+ @Override public void dispose()
+ {
+ if (this.shot != null) {
+ this.shot.dispose();
+ }
+ if (this.shots != null) {
+ for (ShotAnimation shot : shots) {
+ shot.dispose();
+ }
+ }
+ shellFireAnimationPool.free(this);
+ }
+
+ private boolean single;
+ private ShotAnimation shot;
+ private ShotAnimation[] shots;
+
+ private FireAnimation()
+ {
+ }
+
+ private void compute(Config cfg, float x0, float y0, float x1, float y1)
+ {
+ this.single = (cfg.burstCount == 1);
+ if (single) {
+ this.shot = ShotAnimation.obtain();
+ this.shot.compute(0, cfg, x0, y0, x1, y1);
+ } else {
+ this.shots = new ShotAnimation[cfg.burstCount];
+ for (int i = 0; i < cfg.burstCount; i++) {
+ this.shots[i] = ShotAnimation.obtain();
+ this.shots[i].compute(i, cfg, x0, y0, x1, y1);
+ }
+ }
+ }
+
+ @Override public boolean completed()
+ {
+ if (single) {
+ return this.shot.completed();
+ } else {
+ boolean completed = true;
+ for (ShotAnimation shot : this.shots) {
+ completed &= shot.completed();
+ }
+ return completed;
+ }
+ }
+
+ @Override public boolean animate(float delta)
+ {
+ if (single) {
+ return this.shot.animate(delta);
+ } else {
+ boolean completed = true;
+ for (ShotAnimation shot : this.shots) {
+ completed &= shot.animate(delta);
+ }
+ return completed;
+ }
+ }
+
+ @Override public void draw(Batch batch)
+ {
+ if (single) {
+ this.shot.draw(batch);
+ } else {
+ for (ShotAnimation shot : this.shots) {
+ shot.draw(batch);
+ }
+ }
+ }
+}
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/ShellFireAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/ShellFireAnimation.java
deleted file mode 100644
index 1cb6f15..0000000
--- a/core/src/ch/asynk/gdx/boardgame/animations/ShellFireAnimation.java
+++ /dev/null
@@ -1,263 +0,0 @@
-package ch.asynk.gdx.boardgame.animations;
-
-import java.util.Hashtable;
-import java.util.Map;
-import java.util.Random;
-
-import com.badlogic.gdx.audio.Sound;
-import com.badlogic.gdx.graphics.Texture;
-import com.badlogic.gdx.graphics.g2d.Batch;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.utils.Pool;
-
-import ch.asynk.gdx.boardgame.FramedSprite;
-import ch.asynk.gdx.boardgame.Piece;
-
-public class ShellFireAnimation extends TimedAnimation implements Pool.Poolable
-{
- private static class Config
- {
- public float maxFireDelay;
- public float maxFireScattering;
- public float shellSpeed;
- public float smokeDuration;
- public float explosionDuration;
- public FramedSprite shellSprites;
- public FramedSprite explosionSprites;
- public Sound shellFireSnd;
- public Sound explosionSnd;
- public Config(float maxFireDelay, float maxFireScattering, float shellSpeed,
- float smokeDuration, float explosionDuration,
- FramedSprite shellSprites, FramedSprite explosionSprites,
- Sound shellFireSnd, Sound explosionSnd)
- {
- this.maxFireDelay = maxFireDelay;
- this.maxFireScattering = maxFireScattering;
- this.shellSpeed = shellSpeed;
- this.smokeDuration = smokeDuration;
- this.explosionDuration = explosionDuration;
- this.shellSprites = shellSprites;
- this.explosionSprites = explosionSprites;
- this.shellFireSnd = shellFireSnd;
- this.explosionSnd = explosionSnd;
- }
- }
-
- private static Map<String, Config> configs = new Hashtable<String, Config>();
-
- public static void register(final String name,
- float maxFireDelay,
- float maxFireScattering,
- float shellSpeed,
- float smokeDuration,
- float explosionDuration,
- final Texture shellTexture, int shellR, int shellC,
- final Texture explosionTexture, int explosionR, int explosionC,
- final Sound shellFireSnd,
- final Sound explosionSnd
- )
- {
- Config cfg = new Config(maxFireDelay, maxFireScattering, shellSpeed, smokeDuration, explosionDuration,
- new FramedSprite(shellTexture, shellR, shellC),
- new FramedSprite(explosionTexture, explosionR, explosionC),
- shellFireSnd, explosionSnd
- );
- configs.put(name, cfg);
- }
-
- public static void free()
- {
- // for(String key : configs.keySet()) {
- // Config cfg = configs.get(key);
- // }
- configs.clear();
- }
-
- private static Random random = new Random();
-
- private static final Pool<ShellFireAnimation> shellFireAnimationPool = new Pool<ShellFireAnimation>()
- {
- @Override protected ShellFireAnimation newObject()
- {
- return new ShellFireAnimation();
- }
- };
-
- public static Vector2 sv = new Vector2();
- public static Vector2 tv = new Vector2();
- public static ShellFireAnimation obtain(final String configName, Piece shooter, Piece target)
- {
- shooter.getFireingPoint(sv, target);
- target.getImpactPoint(tv);
- return obtain(configName, sv.x, sv.y, tv.x, tv.y);
- }
-
- public static ShellFireAnimation obtain(final String configName, float x0, float y0, float x1, float y1)
- {
- ShellFireAnimation a = shellFireAnimationPool.obtain();
-
- Config cfg = configs.get(configName);
- if (cfg == null) {
- throw new RuntimeException(String.format("ShellFireAnimation : no configuration named : '%s'", configName));
- }
- a.cfg = cfg;
- a.compute(x0, y0, x1, y1);
-
- return a;
- }
-
- private Config cfg;
-
- private boolean fired;
- private boolean hit;
- private boolean drawFire;
- private boolean drawExplosion;
- private float fireTime;
- private float hitTime;
- private float smokeEndTime;
- private float explosionEndTime;
-
- private FramedSprite shellSprites;
- private float shellW;
- private float shellDx;
- private float shellDy;
- private float shellDw;
-
- private int smokeFrame;
- private float smokeDf;
-
- private FramedSprite explosionSprites;
- private int explosionFrame;
- private int explosionRow;
- private float explosionDf;
-
- private ShellFireAnimation()
- {
- }
-
- @Override public void dispose()
- {
- shellFireAnimationPool.free(this);
- }
-
- private void compute(float x0, float y0, float x1, float y1)
- {
- // scattering
- x1 = (x1 + (random.nextFloat() * cfg.maxFireScattering) - (cfg.maxFireScattering / 2f));
- y1 = (y1 + (random.nextFloat() * cfg.maxFireScattering) - (cfg.maxFireScattering / 2f));
-
- // geometry
- float dx = (x1 - x0);
- float dy = (y1 - y0);
- float a = (float) (MathUtils.atan2(y0 - y1, x0 - x1)) * MathUtils.radiansToDegrees;
- float w = (float) Math.sqrt((dx * dx) + (dy * dy));
-
- // timing
- float fireDuration = (w / cfg.shellSpeed);
- float smokeDuration = cfg.smokeDuration;
- float explosionDuration = cfg.explosionDuration;
- this.fireTime = (random.nextFloat() * cfg.maxFireDelay);
- this.hitTime = this.fireTime + fireDuration;
- this.smokeEndTime = this.hitTime + smokeDuration;
- this.explosionEndTime = this.hitTime + explosionDuration;
- float endTime = (this.smokeEndTime > this.explosionEndTime ? this.smokeEndTime : this.explosionEndTime);
-
- // shell vars
- this.shellSprites = new FramedSprite(cfg.shellSprites);
- this.shellSprites.x = x0;
- this.shellSprites.y = y0;
- this.shellSprites.a = a;
- this.shellW = 0f;
- this.shellDw = (w / fireDuration);
- this.shellDx = (dx / fireDuration);
- this.shellDy = (dy / fireDuration);
-
- // smoke vars
- this.smokeFrame = 0;
- this.smokeDf = ((shellSprites.rows - 1) / smokeDuration);
-
- // explosion vars
- this.explosionFrame = 0;
- this.explosionSprites = new FramedSprite(cfg.explosionSprites);
- this.explosionSprites.x = (x1 - (explosionSprites.getFrame().getRegionWidth() / 2.0f));
- this.explosionSprites.y = (y1 - (explosionSprites.getFrame().getRegionHeight() / 2.0f));
- this.explosionDf = (explosionSprites.cols / explosionDuration);
- this.explosionRow = random.nextInt(explosionSprites.rows);
- this.explosionSprites.setFrame(explosionRow, 0);
-
- this.fired = false;
- this.hit = false;
- this.drawFire = false;
- this.drawExplosion = false;
- setDuration(endTime);
- }
-
- @Override public void begin() { }
- @Override public void end() { }
-
- @Override public void update(float delta)
- {
- if (!fired && (elapsed < fireTime)) {
- return;
- }
-
- if (!fired) {
- fired = true;
- drawFire = true;
- if(cfg.shellFireSnd != null) {
- cfg.shellFireSnd.play();
- }
- }
-
- if (!hit && (elapsed < hitTime)) {
- this.shellW += (shellDw * delta);
- this.shellSprites.x += (shellDx * delta);
- this.shellSprites.y += (shellDy * delta);
- this.shellSprites.getFrame().setRegionWidth((int) shellW);
- return;
- }
-
- if (!hit) {
- hit = true;
- drawExplosion = true;
- if(cfg.explosionSnd != null) {
- cfg.explosionSnd.play();
- }
- }
-
- float dt = (elapsed - hitTime);
-
- if (elapsed < smokeEndTime) {
- int frame = (int) (dt * smokeDf) + 1;
- if (frame != smokeFrame) {
- smokeFrame = frame;
- this.shellSprites.setFrame(smokeFrame, 0);
- this.shellSprites.getFrame().setRegionWidth((int) shellW);
- }
- } else {
- drawFire = false;
- }
-
- if (elapsed < explosionEndTime) {
- int frame = (int) (dt * explosionDf);
- if (frame != explosionFrame) {
- explosionFrame = frame;
- explosionSprites.setFrame(explosionRow, explosionFrame);
- }
- } else {
- drawExplosion = false;
- }
- }
-
- @Override public void draw(Batch batch)
- {
- if (drawFire) {
- this.shellSprites.draw(batch);
- }
-
- if (drawExplosion) {
- this.explosionSprites.draw(batch);
- }
- }
-}
diff --git a/core/src/ch/asynk/gdx/boardgame/animations/ShotAnimation.java b/core/src/ch/asynk/gdx/boardgame/animations/ShotAnimation.java
new file mode 100644
index 0000000..890b6a4
--- /dev/null
+++ b/core/src/ch/asynk/gdx/boardgame/animations/ShotAnimation.java
@@ -0,0 +1,186 @@
+package ch.asynk.gdx.boardgame.animations;
+
+import java.util.Random;
+
+import com.badlogic.gdx.audio.Sound;
+import com.badlogic.gdx.graphics.g2d.Batch;
+import com.badlogic.gdx.math.MathUtils;
+import com.badlogic.gdx.utils.Pool;
+
+import ch.asynk.gdx.boardgame.FramedSprite;
+import ch.asynk.gdx.boardgame.Drawable;
+
+public class ShotAnimation extends TimedAnimation implements Drawable, Pool.Poolable
+{
+ private static final Pool<ShotAnimation> shotAnimationPool = new Pool<ShotAnimation>()
+ {
+ @Override protected ShotAnimation newObject()
+ {
+ return new ShotAnimation();
+ }
+ };
+
+ public static ShotAnimation obtain()
+ {
+ return shotAnimationPool.obtain();
+ }
+
+ @Override public void dispose()
+ {
+ shotAnimationPool.free(this);
+ }
+
+ private boolean fired;
+ private boolean hit;
+ private boolean drawFire;
+ private boolean drawExplosion;
+ private float fireTime;
+ private float hitTime;
+ private float smokeEndTime;
+ private float explosionEndTime;
+
+ private FramedSprite shellSprites;
+ private float shellW;
+ private float shellDx;
+ private float shellDy;
+ private float shellDw;
+ private Sound fireSnd;
+
+ private int smokeFrame;
+ private float smokeDf;
+
+ private FramedSprite explosionSprites;
+ private int explosionFrame;
+ private int explosionRow;
+ private float explosionDf;
+ private Sound explosionSnd;
+
+ private static Random random = new Random();
+
+ public void compute(int i, FireAnimation.Config cfg, float x0, float y0, float x1, float y1)
+ {
+ // scattering
+ x1 = (x1 + (random.nextFloat() * cfg.maxFireScattering) - (cfg.maxFireScattering / 2f));
+ y1 = (y1 + (random.nextFloat() * cfg.maxFireScattering) - (cfg.maxFireScattering / 2f));
+
+ // geometry
+ float dx = (x1 - x0);
+ float dy = (y1 - y0);
+ float r = (float) (MathUtils.atan2(y0 - y1, x0 - x1)) * MathUtils.radiansToDegrees;
+ float w = (float) Math.sqrt((dx * dx) + (dy * dy));
+
+ // timing
+ float fireDuration = (w / cfg.shellSpeed);
+ float smokeDuration = cfg.smokeDuration;
+ float explosionDuration = cfg.explosionDuration;
+ this.fireTime = (random.nextFloat() * cfg.maxFireDelay) + (i * cfg.burstDelay);
+ this.hitTime = this.fireTime + fireDuration;
+ this.smokeEndTime = this.hitTime + smokeDuration;
+ this.explosionEndTime = this.hitTime + explosionDuration;
+ float endTime = (this.smokeEndTime > this.explosionEndTime ? this.smokeEndTime : this.explosionEndTime);
+
+ // shell vars
+ this.shellSprites = new FramedSprite(cfg.shellSprites);
+ this.shellSprites.x = x0;
+ this.shellSprites.y = y0;
+ this.shellSprites.r = r;
+ this.shellW = 0f;
+ this.shellDw = (w / fireDuration);
+ this.shellDx = (dx / fireDuration);
+ this.shellDy = (dy / fireDuration);
+ this.fireSnd = (i == 0 ? cfg.shellFireSnd : null);
+
+ // smoke vars
+ this.smokeFrame = 0;
+ this.smokeDf = ((shellSprites.rows - 1) / smokeDuration);
+
+ // explosion vars
+ if (cfg.explosionSprites == null) {
+ this.explosionSnd = null;
+ this.explosionSprites = null;
+ } else {
+ this.explosionFrame = 0;
+ this.explosionSprites = new FramedSprite(cfg.explosionSprites);
+ this.explosionSprites.x = (x1 - (explosionSprites.getFrame().getRegionWidth() / 2.0f));
+ this.explosionSprites.y = (y1 - (explosionSprites.getFrame().getRegionHeight() / 2.0f));
+ this.explosionDf = (explosionSprites.cols / explosionDuration);
+ this.explosionRow = random.nextInt(explosionSprites.rows);
+ this.explosionSprites.setFrame(explosionRow, 0);
+ this.explosionSnd = cfg.explosionSnd;
+ }
+
+ this.fired = false;
+ this.hit = false;
+ this.drawFire = false;
+ this.drawExplosion = false;
+ setDuration(endTime);
+ }
+
+ @Override public void begin() { }
+ @Override public void end() { }
+
+ @Override public void update(float delta)
+ {
+ if (!fired && (elapsed < fireTime)) {
+ return;
+ }
+
+ if (!fired) {
+ fired = true;
+ drawFire = true;
+ if(fireSnd != null) {
+ fireSnd.play();
+ }
+ }
+
+ if (!hit && (elapsed < hitTime)) {
+ this.shellW += (shellDw * delta);
+ this.shellSprites.x += (shellDx * delta);
+ this.shellSprites.y += (shellDy * delta);
+ this.shellSprites.getFrame().setRegionWidth((int) shellW);
+ return;
+ }
+
+ if (!hit) {
+ hit = true;
+ drawExplosion = true;
+ if(explosionSnd != null) {
+ explosionSnd.play();
+ }
+ }
+
+ float dt = (elapsed - hitTime);
+
+ if (elapsed < smokeEndTime) {
+ int frame = (int) (dt * smokeDf) + 1;
+ if (frame != smokeFrame) {
+ smokeFrame = frame;
+ this.shellSprites.setFrame(smokeFrame, 0);
+ this.shellSprites.getFrame().setRegionWidth((int) shellW);
+ }
+ } else {
+ drawFire = false;
+ }
+
+ if (elapsed < explosionEndTime) {
+ int frame = (int) (dt * explosionDf);
+ if (frame != explosionFrame) {
+ explosionFrame = frame;
+ explosionSprites.setFrame(explosionRow, explosionFrame);
+ }
+ } else {
+ drawExplosion = false;
+ }
+ }
+
+ @Override public void draw(Batch batch)
+ {
+ if (drawFire) {
+ this.shellSprites.draw(batch);
+ }
+
+ if (drawExplosion) {
+ this.explosionSprites.draw(batch);
+ }
+ }
+}