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; import java.util.Set; import java.util.HashSet; import java.util.Iterator; 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 Set lasers = new HashSet(); private Set allShooters = new HashSet(); private Shooter ship; private int enemiesKilled = 0; private int shotsTaken = 0; private final int WAIT = (int)Math.pow(2.0, 22.0); public ShooterApplet() { Shooter s = new Shooter(FIELD_WIDTH / 2, FIELD_HEIGHT / 2); s.setPlayerShip(); allShooters.add(s); 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); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; drawBorder(g2); printStats(g2); renderShips(g2); doLasers(g2); buffer(); repaint(); } private void setPlayerShipTurretAngles(double angleX, double angleY) { Shooter s; Iterator iter = allShooters.iterator(); while(iter.hasNext()) { s = (Shooter)iter.next(); if(s.isPlayerShip()) s.setTurretAngle(angleX, angleY); } } private void firePlayerShips() { Shooter s; Iterator iter = allShooters.iterator(); while(iter.hasNext()) { s = (Shooter)iter.next(); if(s.isPlayerShip()) lasers.add(s.fire()); } } 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(Laser las) { lasers.remove(las); } private void doLasers(Graphics2D g2) { Iterator iter = allShooters.iterator(); while(iter.hasNext()) { Laser las = (Laser)iter.next(); if(isOffScreen(las)) { destroyLaser(las); } else { if(!checkEnemyCollisions(las)) { las.draw(g2); las.move(); } } } } private boolean checkEnemyCollisions(Laser las) { Shooter s; Iterator iter = allShooters.iterator(); while(iter.hasNext()) { s = (Shooter)iter.next(); if(las.isHitting(s)) { s.takeHit(); destroyLaser(las); return true; } } return false; } private void drawBorder(Graphics2D g2) { g2.draw(new Rectangle(0, 0, FIELD_WIDTH, FIELD_HEIGHT)); } private void renderShips(Graphics2D g2) { Iterator iter = allShooters.iterator(); while(iter.hasNext()) { Shooter s = (Shooter)iter.next(); if(s.isDead()) { if(s == ship) { } else { destroyShooter(s); enemiesKilled++; if(enemiesKilled % 3 == 0) spawnNewPlayerShip(); spawnNewEnemy(); } } else { if(isOffScreen(s)) { destroyShooter(s); 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(Shooter s) { allShooters.remove(s); } 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() { System.out.println("init attempted"); repaint(); } private Shooter findNextPlayerShip() { Iterator iter = allShooters.iterator(); Shooter s; while(iter.hasNext()) { s = (Shooter)iter.next(); if(s.isPlayerShip()) return s; } return null; } }