package com.spaceshooter; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.math.Intersector; import com.badlogic.gdx.math.MathUtils; //EnemyManager class handles and updates all enemies. public class EnemyManager { public List<Enemy> enemyList; private List<Enemy> enemyQueue; /*holds references to enemies that need to be added. since you cannot add while iterating through a list */ private float enemyTimer; private boolean collision = false; private final int MIDDLE_LEFT = SpaceShooter.getLeftBound()/2; private final int MIDDLE_RIGHT = SpaceShooter.getRightBound()/2; private float enemyTimerLimit; //The number the enemyTimer reaches before it goes back to zero. EnemyManager() { enemyList = new ArrayList<Enemy>(); enemyQueue = new ArrayList<Enemy>(); enemyTimer = 0.0f; enemyTimerLimit = 1.1f; } public void update(Player player, ScoreHandler scorehandler, BulletManager bulletManager) { enemyTimer += Gdx.graphics.getDeltaTime() / 5; // Enemies either have an initial x position of 0, MIDDLE_LEFT, or MIDDLE_RIGHT. int type = MathUtils.random(0,2); int x = 0; if (type == 1) x = MIDDLE_LEFT; else if (type == 2) x = MIDDLE_RIGHT; /*createEnemy(MathUtils.random(SpaceShooter.getLeftBound()/2,SpaceShooter.getRightBound()/2), SpaceShooter.getTopBound() + 100);*/ if (scorehandler.getScore() < 20000) enemyTimerLimit = 1.1f; else if (scorehandler.getScore() > 20000 && scorehandler.getScore() < 40000) enemyTimerLimit = 1.0f; else if (scorehandler.getScore() > 40000 && scorehandler.getScore() < 60000) enemyTimerLimit = 1.0f; else if (scorehandler.getScore() > 60000 && scorehandler.getScore() < 80000) enemyTimerLimit = 0.9f; else if (scorehandler.getScore() > 100000 && scorehandler.getScore() < 120000) enemyTimerLimit = 0.8f; else if (scorehandler.getScore() > 120000 && scorehandler.getScore() < 140000) enemyTimerLimit = 0.8f; else if (scorehandler.getScore() > 140000 && scorehandler.getScore() < 160000) enemyTimerLimit = 0.7f; else if (scorehandler.getScore() > 160000 && scorehandler.getScore() < 200000) enemyTimerLimit = 0.7f; else if (scorehandler.getScore() > 200000 && scorehandler.getScore() < 300000) // SUPER HARD!! enemyTimerLimit = 0.6f; else if (scorehandler.getScore() > 300000 && scorehandler.getScore() < 400000) // SUPER HARD!! enemyTimerLimit = 0.6f; else if (scorehandler.getScore() > 400000 && scorehandler.getScore() < 500000) // SUPER HARD!! enemyTimerLimit = 0.5f; else if (scorehandler.getScore() > 600000 && scorehandler.getScore() < 700000) // SUPER HARD!! enemyTimerLimit = 0.4f; else if (scorehandler.getScore() > 700000) // SUPER HARD!! enemyTimerLimit = 0.3f; createEnemy(x, SpaceShooter.getTopBound() + 100); ListIterator<Enemy> enemyIter = enemyList.listIterator(); while (enemyIter.hasNext()) { Enemy e = enemyIter.next(); e.updateEnemy(player, bulletManager); if (player != null) { if (Intersector.overlaps(e.getBoundingRectangle(), player.getBoundingRectangle()) == true) { if (!player.isBlinking) { /* * In the future, check for enemy types and add a higher or * lower score Depending on the enemy */ player.killPlayer(); collision = true; } } } if ((e.getY() < SpaceShooter.getBottomBound() - e.getHeight()) || (e.getY() > SpaceShooter.getTopBound() + e.getHeight() + 500) || (e.getX() < SpaceShooter.getLeftBound() - e.getWidth()) || (e.getX() > SpaceShooter.getRightBound() + e.getWidth()) ) enemyIter.remove(); else if (collision) { e.hit(); if (e.isDead) { enemyIter.remove(); } collision = false; } } //Add enemies that are part of the queue now that we are not iterating. for (Enemy e : enemyQueue) { if (e != null) enemyList.add(e); } //Clear the queue: enemyQueue.clear(); } public void addEnemy(Enemy enemy,float x,float y) { enemy.setPosition(x, y); enemyQueue.add(enemy); } public List<Enemy> getList() { return enemyList; } public void createEnemy(float x, float y) { if (enemyTimer > enemyTimerLimit) { int rand = MathUtils.random(12); if (rand == 0) { // More randomization to vary up the game. int rand2 = MathUtils.random(2); if (rand2 == 0) EnemyPatterns.blockade(this,x, y,"EnemyTurret",1,4); else if (rand2 == 1) EnemyPatterns.blockade(this,x, y,"EnemyTurret",2,3); else if (rand2 == 2) EnemyPatterns.blockade(this,x, y,"EnemyTurret",2,2); enemyTimer = 0.0f; } else if (rand == 1) { int rand2 = MathUtils.random(2); if (rand2 == 0) EnemyPatterns.blockade(this,SpaceShooter.getLeftBound(), y,"EnemySpinner",4,2); else if (rand2 == 1) EnemyPatterns.blockade(this,x, y,"EnemySpinner",1,4); else if (rand2 == 2) EnemyPatterns.blockade(this,SpaceShooter.getLeftBound(), y,"EnemySpinner",4,1); enemyTimer = 0.0f; } else if (rand == 2) { if (x != MIDDLE_RIGHT) EnemyPatterns.blockade(this, x, y,"EnemyPopcorn",5,3); else EnemyPatterns.blockade(this, x, y,"EnemyPopcorn",3,3); enemyTimer = 0.0f; } else if (rand == 3) { int rand2 = MathUtils.random(2); if (rand2 == 0) EnemyPatterns.sineWave(this, x, y,20,"EnemyPopcorn"); else if (rand2 == 1) EnemyPatterns.sineWave(this, x, y,15,"EnemyPopcorn"); else if (rand2 == 2) EnemyPatterns.sineWave(this, x, y,25,"EnemyPopcorn"); enemyTimer = 0.0f; } else if (rand == 4) { //EnemyPatterns.sineWave(this, x, y,2,"EnemyKiller1"); int rand2 = MathUtils.random(2); if (rand2 == 0) EnemyPatterns.blockade(this,SpaceShooter.getLeftBound(), y,"EnemyKiller1",2,1); else if (rand2 == 1) EnemyPatterns.blockade(this,x, y,"EnemyKiller1",1,1); else if (rand2 == 2) EnemyPatterns.blockade(this,x, y,"EnemyKiller1",1,2); enemyTimer = 0.0f; } else if (rand == 5) { int rand2 = MathUtils.random(1); if (rand2 == 0) EnemyPatterns.sineWave(this,MIDDLE_LEFT, y,2,"EnemyKiller1"); else if (rand2 == 1) EnemyPatterns.sineWave(this,MIDDLE_LEFT, y,1,"EnemyKiller1"); enemyTimer = 0.0f; } else if (rand == 6) { EnemyRedship enemy = new EnemyRedship(); enemy.setPosition(MIDDLE_LEFT, y); enemyList.add(enemy); enemyTimer = 0.0f; } else if (rand == 7) { int rand2 = MathUtils.random(1); if (rand2 == 0) { EnemyEye enemy = new EnemyEye(); enemy.setPosition(x, y); enemyList.add(enemy); enemyTimer = 0.0f; } else { EnemyPatterns.blockade(this,SpaceShooter.getLeftBound(), y,"EnemyEye",4,1); } } else if (rand == 8) { int rand2 = MathUtils.random(8); //One eighth chance of a hard cargo spawn if (rand2 == 0) { EnemyCargo enemy = new EnemyCargo(this); enemy.setPosition(SpaceShooter.getLeftBound(), y); enemyList.add(enemy); EnemyCargo enemy2 = new EnemyCargo(this); enemy2.setPosition(SpaceShooter.getRightBound() - enemy2.getWidth(), y); enemyList.add(enemy2); enemyTimer = 0.0f; } else { EnemyCargo enemy = new EnemyCargo(this); enemy.setPosition(x, y); enemyList.add(enemy); enemyTimer = 0.0f; } } else if (rand == 9) { EnemyFactory enemy = new EnemyFactory(this); enemy.setPosition(x, y); enemyList.add(enemy); EnemyFactory enemy2 = new EnemyFactory(this); if (x == MIDDLE_LEFT) enemy2.setPosition(x + enemy2.getWidth() + 20, y); else enemy2.setPosition(x - enemy2.getWidth() - 20, y); enemyList.add(enemy2); enemyTimer = 0.0f; } else if (rand == 10) { int rand2 = MathUtils.random(1); if (rand2 == 0) EnemyPatterns.blockade(this,MIDDLE_LEFT, y,"EnemyHoming",5,1); else { EnemyHoming enemy = new EnemyHoming(); enemy.setPosition(x, y); enemyList.add(enemy); enemyTimer = 0.0f; } } else if (rand == 11) { EnemyTongue enemy = new EnemyTongue(this); enemy.setPosition(0, y); enemyList.add(enemy); enemyTimer = 0.0f; } else if (rand == 12) { int rand2 = MathUtils.random(1); if (rand2 == 0) { EnemyPatterns.blockade(this,SpaceShooter.getLeftBound(), y,"EnemyMissileShip",3,1); } else { EnemyMissileShip enemy = new EnemyMissileShip(this); enemy.setPosition(x, y); enemyList.add(enemy); enemyTimer = 0.0f; } } } } public void draw(SpriteBatch batch) { for (Enemy e : enemyList) { if (e != null) { e.draw(batch); if (e instanceof EnemyMissile) ((EnemyMissile) e).drawParticle(batch); e.processHits(); } } } public void clear() { enemyList.clear(); } }