Java tutorial
/* Point & Hit: A fast paced Android game Copyright (C) 2015 Marien Raat This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.jmstudios.pointandhit; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType; public class ShootAnimation { int maxRadius, minRadius; int width, height; int currentRadius; int targetX, targetY; int currentX, currentY; int scoreSize; float shootingDuration, shootingTimeLeft, scoreDuration, scoreTimeLeft; boolean shooting, active; TargetManager targetManager; Texture[] scoreTextures; Texture currentScoreTexture; public ShootAnimation(float shootingDuration, float scoreDuration, Color bulletColor, int minRadius, TargetManager targetManager, Texture[] scoreTextures) { this.shootingDuration = shootingDuration; this.shootingTimeLeft = 0; this.scoreDuration = scoreDuration; this.scoreTimeLeft = 0; this.targetManager = targetManager; this.width = Gdx.graphics.getWidth(); this.height = Gdx.graphics.getHeight(); this.minRadius = minRadius; this.maxRadius = (width / 6); this.currentRadius = 0; this.shooting = false; this.active = false; this.scoreTextures = scoreTextures; scoreSize = width / 8; } public void update() { if (shooting) { shootingTimeLeft -= Gdx.graphics.getDeltaTime(); currentRadius = minRadius + (int) ((float) (maxRadius - minRadius) * Math.pow((shootingTimeLeft / shootingDuration), 2)); int centerX = width / 2, centerY = height / 2; currentX = targetX + (int) ((float) (centerX - targetX) * Math.pow((shootingTimeLeft / shootingDuration), 2)); currentY = targetY + (int) ((float) (centerY - targetY) * Math.pow((shootingTimeLeft / shootingDuration), 2)); } else if (active) { scoreTimeLeft -= Gdx.graphics.getDeltaTime(); } if (shootingTimeLeft <= 0 && shooting && active) { shooting = false; int extraScore = targetManager.hit(new Vector2(targetX, targetY)); if (extraScore != 0) { int index = extraScore - (extraScore > 3 ? 2 : 1); currentScoreTexture = scoreTextures[index]; scoreTimeLeft = scoreDuration; active = true; } else { active = false; } } if (scoreTimeLeft <= 0 && !shooting && active) { active = false; } } // Call ShapeRenderer.begin() before calling this method // And call ShapeRenderer.end() when targetYou're done with it public void draw(ShapeRenderer shapeRenderer) { if (shooting) { ShapeType previousType = shapeRenderer.getCurrentType(); shapeRenderer.set(ShapeType.Filled); shapeRenderer.setColor(targetManager.currentTheme.bullet); shapeRenderer.circle(currentX, currentY, currentRadius); shapeRenderer.set(previousType); } } public void draw(SpriteBatch batch) { if (active && !shooting) { batch.draw(currentScoreTexture, targetX - scoreSize, targetY - scoreSize, scoreSize, scoreSize); } } public void startShoot(int targetX, int targetY) { this.targetX = targetX; this.targetY = targetY; this.currentX = width / 2; this.currentY = height / 2; this.shootingTimeLeft = shootingDuration; this.currentRadius = maxRadius; this.shooting = true; this.active = true; } public boolean isShooting() { return shooting; } public boolean isActive() { return active; } }