diff options
Diffstat (limited to 'core/src')
| -rw-r--r-- | core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java | 157 | 
1 files changed, 84 insertions, 73 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 3327680..3af4a81 100644 --- a/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java +++ b/core/src/ch/asynk/tankontank/engine/gfx/animations/InfantryFireAnimation.java @@ -41,6 +41,84 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab          {              this.fireRegion = region;          } + +        public void set(float x0, float y0, float x1, float y1, float halfWidth) +        { +            // 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); + +            this.fired = false; +            this.fire_time = delay; +            this.hit_time = (this.fire_time + fire_duration); +            this.end_time = (this.hit_time + hit_duration); + +            // fire vars +            this.fire_a = a; +            this.fire_x = x0; +            this.fire_y = y0; +            this.fire_w = 0; +            this.fire_dx = (dx / fire_duration); +            this.fire_dy = (dy / fire_duration); +            this.fire_dw = (w  / fire_duration); +            this.hit_frame = 0; +        } + +        public boolean animate(float delta) +        { +            if (!fired && (elapsed < fire_time)) +                return false; + +            if (!fired) { +                fired = true; +                FireAnimation.infantryFireSndPlay(volume); +            } + +            if (!hit && (elapsed < hit_time)) { +                fire_w += (fire_dw * delta); +                fire_x += (fire_dx * delta); +                fire_y += (fire_dy * delta); +                fireRegion.setRegionWidth((int) fire_w); +                return false; +            } + +            if (!hit) +                hit = true; + +            if (elapsed < end_time) { +                int frame = (int) ((elapsed - hit_time) / HIT_FRAME_DURATION); +                if (frame != hit_frame) { +                    hit_frame = frame; +                    fireRegion.setRegion(FireAnimation.infantryFire.frames[hit_frame]); +                    fireRegion.setRegionWidth((int) fire_w); +                } +                return false; +            } + +            return true; +        } + +        public void draw(Batch batch) +        { +            if (fired) +                batch.draw(fireRegion, fire_x, fire_y, 0, 0, fireRegion.getRegionWidth(), fireRegion.getRegionHeight(), 1f, 1f, fire_a); +        }      }      private static final int SHOT_COUNT = 10; @@ -82,44 +160,9 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab          this.volume = volume;          this.elapsed = 0f; -        for (Shot shot : shots) { -            // fire geometry -            float x0 = _x0; -            float y0 = (_y0 - (FireAnimation.infantryFire.height / 2.0f)); -            float x1 = (_x1 + ((SHOT_SCATTERING * FireAnimation.random.nextFloat()) - (SHOT_SCATTERING / 2f))); -            float y1 = (_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); - -            shot.fired = false; -            shot.fire_time = delay; -            shot.hit_time = (shot.fire_time + fire_duration); -            shot.end_time = (shot.hit_time + hit_duration); - -            // fire vars -            shot.fire_a = a; -            shot.fire_x = x0; -            shot.fire_y = y0; -            shot.fire_w = 0; -            shot.fire_dx = (dx / fire_duration); -            shot.fire_dy = (dy / fire_duration); -            shot.fire_dw = (w  / fire_duration); -            shot.hit_frame = 0; -        } +        y0 -= (FireAnimation.infantryFire.height / 2.0f); +        for (Shot shot : shots) +            shot.set(x0, y0, x1, y1, halfWidth);      }      @Override @@ -139,39 +182,8 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab          elapsed += delta;          boolean completed = true; -        for (Shot shot : shots) { -            completed &= shot.completed; - -            if (!shot.fired && (elapsed < shot.fire_time)) -                continue; - -            if (!shot.fired) { -                shot.fired = true; -                FireAnimation.infantryFireSndPlay(volume); -            } - -            if (!shot.hit && (elapsed < shot.hit_time)) { -                shot.fire_w += (shot.fire_dw * delta); -                shot.fire_x += (shot.fire_dx * delta); -                shot.fire_y += (shot.fire_dy * delta); -                shot.fireRegion.setRegionWidth((int) shot.fire_w); -                continue; -            } - -            if (!shot.hit) -                shot.hit = true; - -            if (elapsed < shot.end_time) { -                int frame = (int) ((elapsed - shot.hit_time) / HIT_FRAME_DURATION); -                if (frame != shot.hit_frame) { -                    shot.hit_frame = frame; -                    shot.fireRegion.setRegion(FireAnimation.infantryFire.frames[shot.hit_frame]); -                    shot.fireRegion.setRegionWidth((int) shot.fire_w); -                } -                continue; -            } else -                shot.completed = true; -        } +        for (Shot shot : shots) +            completed &= shot.animate(delta);          return completed;      } @@ -181,8 +193,7 @@ public class InfantryFireAnimation implements Disposable, Animation, Pool.Poolab      {          for (Shot shot : shots) {              if (shot.fired) -                batch.draw(shot.fireRegion, shot.fire_x, shot.fire_y, 0, 0, -                        shot.fireRegion.getRegionWidth(), shot.fireRegion.getRegionHeight(), 1f, 1f, shot.fire_a); +                shot.draw(batch);          }      } | 
