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 java.util.Random; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.glutils.ShapeRenderer; import com.badlogic.gdx.math.Vector2; public class TargetManager { float targetLifeTime; int targetRadius; Target target; int screenX, screenY; int lowerX, lowerY, higherX, higherY; int score, lifes; boolean shoot; Random randomGenerator; UserPointer userPointer; BulletManager bulletManager; LoseLifeEffect loseLifeEffect; GameTheme currentTheme, blueTheme, purpleTheme, brownTheme, darkBlueTheme, greenTheme; GameScreen screen; public TargetManager(float targetLifeTime, int targetRadius, Vector2 screenSize, UserPointer userPointer, GameScreen screen) { this.screen = screen; this.targetLifeTime = targetLifeTime; this.targetRadius = targetRadius; this.userPointer = userPointer; this.shoot = false; this.screenX = (int) screenSize.x; this.screenY = (int) screenSize.y; int targetRadiusBound = targetRadius / 2; lowerX = targetRadiusBound; lowerY = targetRadiusBound; higherX = screenX - targetRadiusBound; higherY = screenY - targetRadiusBound; this.randomGenerator = new Random(); spawnNewTarget(); this.bulletManager = new BulletManager(0.4f, this, userPointer); this.loseLifeEffect = new LoseLifeEffect(0.4f, this); // Theme blueTheme = new GameTheme(); blueTheme.background = new Color(0.2f, 0.4f, 0.5f, 1); blueTheme.target = new Color(0.9f, 0.35f, 0.1f, 1); blueTheme.userPointer = Color.WHITE; blueTheme.bullet = Color.LIGHT_GRAY; purpleTheme = new GameTheme(); purpleTheme.background = new Color(0.2f, 0.2f, 0.5f, 1); purpleTheme.target = new Color(0.87f, 0.58f, 0.85f, 1); purpleTheme.userPointer = Color.WHITE; purpleTheme.bullet = Color.LIGHT_GRAY; darkBlueTheme = new GameTheme(); darkBlueTheme.background = new Color(0.235f, 0.235f, 0.39f, 1); darkBlueTheme.target = new Color(0.39f, 0.69f, 0.29f, 1); darkBlueTheme.userPointer = Color.WHITE; darkBlueTheme.bullet = Color.LIGHT_GRAY; brownTheme = new GameTheme(); brownTheme.background = new Color(0.45f, 0.28f, 0.24f, 1); brownTheme.target = new Color(0.51f, 0.75f, 0.81f, 1); brownTheme.userPointer = Color.WHITE; brownTheme.bullet = Color.LIGHT_GRAY; greenTheme = new GameTheme(); greenTheme.background = new Color(0.34f, 0.53f, 0.27f, 1); greenTheme.target = new Color(0.42f, 0.33f, 0.55f, 1); greenTheme.userPointer = Color.WHITE; greenTheme.bullet = Color.LIGHT_GRAY; this.score = 0; this.currentTheme = getTheme(score); this.lifes = 3; } public void update() { bulletManager.update(); loseLifeEffect.update(); if (this.shoot) { shootBullet(); this.shoot = false; } if (!loseLifeEffect.isActive()) { target.update(); if (!target.exists()) { lifes--; loseLifeEffect.start(); } } if (lifes <= 0 && screen != null) { loseLifeEffect.active = false; screen.gameOver(); } } public void draw(ShapeRenderer shapeRenderer) { if (!loseLifeEffect.isActive()) { target.draw(shapeRenderer); } bulletManager.draw(shapeRenderer); } public void draw(SpriteBatch batch) { bulletManager.draw(batch); loseLifeEffect.draw(batch); } public void spawnTarget() { // Temp difficulty float lifeTime = (float) (targetLifeTime * (1.0f - (float) ((Math.pow(score, (double) (1.0 / 3.0)) / 20.0)))); target.reinnitialize(lifeTime, targetRadius, randomSpawnLocation(), Color.BLUE); } public void spawnNewTarget() { // Temp difficulty float lifeTime = (float) (targetLifeTime * (1 - (Math.pow(score, 1 / 3) / 10))); target = new Target(lifeTime, targetRadius, randomSpawnLocation(), this, 0.15f); } private void shootBullet() { bulletManager.shoot(); } public int hit(Vector2 position) { Vector2 targetPosition = target.getCenterPosition(); if (targetPosition.cpy().sub(position).len() < target.getRadius() + userPointer.getRadius() && !target.dying && !loseLifeEffect.isActive()) { int extraScore = getHitScore((float) (target.getRadius()) / (float) (target.getStartRadius())); score += extraScore; currentTheme = getTheme(score); target.explode(position); return extraScore; } else { return 0; } } private int getHitScore(float ratio) { int hitScore = 0; if (ratio > 0.65f) { hitScore = 5; } else if (ratio > 0.55f) { hitScore = 3; } else if (ratio > 0.4f) { hitScore = 2; } else { hitScore = 1; } return hitScore; } public int getScore() { return score; } private Vector2 randomSpawnLocation() { int x = randomGenerator.nextInt(higherX - lowerX) + lowerX; int y = randomGenerator.nextInt(higherY - lowerY) + lowerY; return new Vector2(x, y); } public GameTheme getTheme(int score) { if (score < 50) { return blueTheme; } else if (score < 100) { return darkBlueTheme; } else if (score < 150) { return brownTheme; } else { return greenTheme; } } public void screenTouchDown() { this.shoot = true; } }