import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseMotionListener; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Graphics; import java.applet.Applet; import java.awt.Rectangle; import java.util.ArrayList; import java.lang.Math; import java.util.Random; import java.awt.Color; public class ShooterApplet extends Applet { private final int FIELD_HEIGHT = 500; private final int FIELD_WIDTH = 500; private final static Random rand = new Random(); private ArrayList lasers = new ArrayList(); private ArrayList allShooters = new ArrayList(); private Shooter ship; private int enemiesKilled = 0; private int shotsTaken = 0; private final int WAIT = (int)Math.pow(2.0, 22.0); public ShooterApplet() { spawnNewEnemy(); allShooters.add(new Shooter(FIELD_WIDTH / 2, FIELD_HEIGHT / 2)); ((Shooter)allShooters.get(0)).setPlayerShip(); ship = (Shooter)allShooters.get(0); allShooters.add(new Shooter(FIELD_WIDTH / 2, FIELD_HEIGHT / 2)); class ShipListener extends MouseAdapter implements MouseMotionListener { public void mouseMoved(MouseEvent event) { setPlayerShipTurretAngles((double)event.getX(), (double)event.getY()); repaint(); } public void mouseDragged(MouseEvent event) {} public void mousePressed(MouseEvent event) { firePlayerShips(); shotsTaken++; } } MouseMotionListener listener = new ShipListener(); addMouseMotionListener(listener); addMouseListener((MouseListener)listener); } private void setPlayerShipTurretAngles(double angleX, double angleY) { Shooter s; for(int i = 0; i < allShooters.size(); i++) { s = (Shooter)allShooters.get(i); if(s.isPlayerShip()) s.setTurretAngle(angleX, angleY); } } private void firePlayerShips() { Shooter s; for(int i = 0; i < allShooters.size(); i++) { s = (Shooter)allShooters.get(i); if(s.isPlayerShip()) lasers.add(s.fire()); } } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; drawBorder(g2); printStats(g2); renderShips(g2); doLasers(g2); buffer(); repaint(); } private void printStats(Graphics2D g2) { g2.setColor(Color.black); g2.drawString("Enemies Killed: " + enemiesKilled, 0, FIELD_HEIGHT + 12); g2.drawString("Shots Taken: " + shotsTaken, 0, FIELD_HEIGHT + 24); if(enemiesKilled > 0) { g2.drawString("Average Shots Per Enemy: " + (int)((double)shotsTaken / (double)enemiesKilled), 0, FIELD_HEIGHT + 36); } } private void buffer() { int j; for(int i = WAIT; i >= 0; i--) { j = i; } } private boolean isOffScreen(Laser las) { return las.getX() < 0 || las.getX() > FIELD_WIDTH || las.getY() < 0 || las.getY() > FIELD_HEIGHT; } private void destroyLaser(int laserIndex) { lasers.remove(laserIndex); } private void doLasers(Graphics2D g2) { for(int i = 0; i < lasers.size(); i++) { Laser las = (Laser)lasers.get(i); if(isOffScreen(las)) { destroyLaser(i); } else { if(!checkEnemyCollisions(las)) { las.draw(g2); las.move(); } } } } private boolean checkEnemyCollisions(Laser las) { Shooter s; for(int i = 0; i < allShooters.size(); i++) { s = (Shooter)allShooters.get(i); if(las.isHitting(s)) { s.takeHit(); destroyLaser(i); return true; } } return false; } private void drawBorder(Graphics2D g2) { g2.draw(new Rectangle(0, 0, FIELD_WIDTH, FIELD_HEIGHT)); } private void renderShips(Graphics2D g2) { for(int i = 0; i < allShooters.size() - 1; i++) { Shooter s = (Shooter)allShooters.get(i); if(s.isDead()) { if(s == ship) { ship = findNextPlayerShip(0); if(ship == (Shooter)allShooters.get(i)) spawnNewPlayerShip(); } destroyShooter(i); enemiesKilled++; if(enemiesKilled % 3 == 0) spawnNewPlayerShip(); spawnNewEnemy(); } else { if(isOffScreen(s)) { destroyShooter(i); spawnNewEnemy(); } if(!s.isPlayerShip()) { enemyAI(s); } s.draw(g2); } } } private void enemyAI(Shooter s) { s.move(); if(rand.nextInt(10) == 0) { s.setTurretAngle(s.getTurretAngle() + .03); } if(rand.nextInt(10) == 0) { s.setTurretAngle(s.getTurretAngle() - .03); } if(rand.nextInt(10) == 0) lasers.add(s.fire()); } private boolean isOffScreen(Shooter s) { return s.getX() < 0 || s.getX() > FIELD_WIDTH || s.getY() < 0 || s.getY() > FIELD_HEIGHT; } private void destroyShooter(int enemyIndex) { allShooters.remove(enemyIndex); } private void spawnNewEnemy() { Shooter s = new Shooter(rand.nextInt(FIELD_WIDTH), rand.nextInt(FIELD_HEIGHT)); s.setTurretAngle(2 * Math.PI * rand.nextDouble()); s.setShipDirection(2 * Math.PI * rand.nextDouble()); allShooters.add(s); } private void spawnNewPlayerShip() { Shooter s = new Shooter(rand.nextInt(FIELD_WIDTH), rand.nextInt(FIELD_HEIGHT)); s.setTurretAngle(2 * Math.PI * rand.nextDouble()); s.setPlayerShip(); allShooters.add(s); } public void init() { repaint(); } private Shooter findNextPlayerShip(int minIndex) { for(int i = minIndex; i < allShooters.size(); i++) { if(((Shooter)allShooters.get(i)).isPlayerShip()) return (Shooter)allShooters.get(i); } return (Shooter)allShooters.get(minIndex); } }