diff options
author | Jérémy Zurcher <jeremy@asynk.ch> | 2014-12-05 14:52:40 +0100 |
---|---|---|
committer | Jérémy Zurcher <jeremy@asynk.ch> | 2014-12-05 14:52:40 +0100 |
commit | bd8eb80cf2c58d249050d999391beb6f0d6e37ea (patch) | |
tree | 1bbea56a2fb491657b7592e011e7125f6fe80c7e /core/src/ch/asynk/tankontank/engine | |
parent | f88b3ccb4c89e47b52a03df0e212b5be05f02e34 (diff) | |
download | RustAndDust-bd8eb80cf2c58d249050d999391beb6f0d6e37ea.zip RustAndDust-bd8eb80cf2c58d249050d999391beb6f0d6e37ea.tar.gz |
InfantryFireAnimation: improve shoting animation
Diffstat (limited to 'core/src/ch/asynk/tankontank/engine')
-rw-r--r-- | core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java b/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java index 34641cc..11e5c68 100644 --- a/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java +++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java @@ -42,25 +42,12 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab this.fireRegion = region; } - public void set(float x0, float y0, float x1, float y1, float halfWidth) + public void set(float delay, float x0, float y0, float x1, float y1, float w, float a) { - // fire geometry - x1 += ((SHOT_SCATTERING * FireAnimation.random.nextFloat()) - (SHOT_SCATTERING / 2f)); - y1 += ((SHOT_SCATTERING * FireAnimation.random.nextFloat()) - (SHOT_SCATTERING / 2f)); - - double r = Math.atan2((y0 - y1), (x0 - x1)); - float xadj = (float) (Math.cos(r) * halfWidth); - float yadj = (float) (Math.sin(r) * halfWidth); - x0 -= xadj; - y0 -= yadj; - - float a = (float) Math.toDegrees(r); float dx = (x1 - x0); float dy = (y1 - y0); - float w = (float) Math.sqrt((dx * dx) + (dy * dy)); // timing - float delay = START_DELAY + (FireAnimation.random.nextFloat() * TIME_SCATTERING); float fire_duration = ((FireAnimation.random.nextFloat() * TIME_SCATTERING) + (w / SHOT_SPEED)); float hit_duration = (FireAnimation.infantryFire.rows * HIT_FRAME_DURATION); @@ -122,7 +109,8 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab } } - private static final int SHOT_COUNT = 10; + private static final int SHOT_COUNT = 20; + private static final float SHOT_DELAY = 0.07f; private static final float SHOT_SCATTERING = 40f; private static final float TIME_SCATTERING = 0.6f; private static final float START_DELAY = 0.8f; @@ -161,9 +149,34 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab this.volume = volume; this.elapsed = 0f; + float delay = START_DELAY + (FireAnimation.random.nextFloat() * TIME_SCATTERING); + y0 -= (FireAnimation.infantryFire.height / 2.0f); - for (Shot shot : shots) - shot.set(x0, y0, x1, y1, halfWidth); + double r = Math.atan2((y0 - y1), (x0 - x1)); + x0 -= ((float) (Math.cos(r) * halfWidth)); + y0 -= ((float) (Math.sin(r) * halfWidth)); + + float dx = (x1 - x0); + float dy = (y1 - y0); + float w = (float) Math.sqrt((dx * dx) + (dy * dy)); + double dr = (Math.atan2(halfWidth, w) / 2f); + + int half = (SHOT_COUNT / 2); + double a = (r + dr); + double aMax = (a - (2 * dr)); + double da = ((2 * dr) / half); + + for (Shot shot : shots) { + float x = (float) (x0 - (Math.cos(a) * w)); + float y = (float) (y0 - (Math.sin(a) * w)); + + shot.set(delay, x0, y0, x, y, w, (float) Math.toDegrees(a)); + + delay += SHOT_DELAY; + a -= da; + if (a <= aMax) + da = -da; + } } @Override |