StartSquare selection, distanceCalc changed in TowerSquare, new level with two StartS...
[AntiTD.git] / src / se / umu / cs / dit06ajnajs / ATDController.java
blob5a8a0ff744839185c6bae97d84c0d3db220c612a
1 package se.umu.cs.dit06ajnajs;
4 import java.awt.Graphics;
5 import java.awt.event.MouseAdapter;
6 import java.awt.event.MouseEvent;
8 import java.util.ArrayList;
9 import java.util.List;
10 import java.util.logging.Logger;
12 import java.awt.event.ActionEvent;
13 import java.awt.event.ActionListener;
14 import java.awt.event.WindowAdapter;
15 import java.awt.event.WindowEvent;
17 import se.umu.cs.dit06ajnajs.agent.Agent;
18 import se.umu.cs.dit06ajnajs.agent.AgentPrototypeFactory;
19 import se.umu.cs.dit06ajnajs.agent.BasicTower;
20 import se.umu.cs.dit06ajnajs.agent.Direction;
21 import se.umu.cs.dit06ajnajs.agent.Unit;
22 import se.umu.cs.dit06ajnajs.map.GoalSquare;
23 import se.umu.cs.dit06ajnajs.map.StartSquare;
24 import se.umu.cs.dit06ajnajs.map.Map;
25 import se.umu.cs.dit06ajnajs.map.MapSquare;
26 import javax.swing.SwingUtilities;
28 public class ATDController {
29 private static Logger logger = Logger.getLogger("AntiTD");
31 private final int FRAMES_PER_SECOND = 20;
33 private ATDModel model;
34 private ATDView view;
36 private boolean running;
37 private Thread animationThread;
39 public ATDController(List<Map> maps) {
40 // Create model and view
41 model = new ATDModel(maps);
42 view = new ATDView(model);
43 connectListeners();
44 initGame();
45 running = true;
46 animationThread = new Thread(new AnimationThread());
47 animationThread.start();
50 public void initGame() {
51 // TODO: game related init
53 // Factory used to create units, Unit details are hardcoded in factory:
54 // speed, cost etc
55 AgentPrototypeFactory factory = AgentPrototypeFactory.getInstance();
56 model.addAgent(factory.createUnit("FootmanUnit", 100 - 46, 200,
57 Direction.UP, model.getMap()));
59 model.addTower(new BasicTower(41, 41, 1, (int) (AntiTD.SQUARE_SIZE*1.5)));
60 //model.addTower(new BasicTower(20, 20, 10, (int) (AntiTD.SQUARE_SIZE * 2.5)));
63 private class AnimationThread implements Runnable {
64 public void run() {
65 // TODO Auto-generated method stub
66 // Paint background
67 view.repaintGame();
69 while (running) {
70 // Update all agents
71 List<Agent> agents = model.getAgents();
72 List<Agent> deadAgents = new ArrayList<Agent>();
73 for (Agent agent : agents) {
74 if (agent.isAlive()) {
75 agent.act();
76 } else {
77 deadAgents.add(agent);
78 logger.info("Dead unit is collected to list deadAgents");
82 if (!deadAgents.isEmpty()) {
83 agents.removeAll(deadAgents);
84 logger.info("Dead agents cleared");
87 // Remove units from goalsquares and count points
88 GoalSquare[] goalSquares = model.getGoalSquares();
89 for (GoalSquare square : goalSquares) {
90 List<Unit> goalUnits = square.getUnits();
91 if (goalUnits != null) {
92 for (Unit unit : goalUnits) {
93 agents.remove(unit);
94 // TODO At tower can still have a pointer to the removed unit
95 logger.info("Unit >" + unit.getClass().getSimpleName() +
96 "< has reached a goal and is now removed");
97 // TODO count points
99 goalUnits.clear();
103 // Repaint all agents
104 Graphics g = view.getGameGraphics();
105 for (Agent agent : agents) {
106 //TODO kan det finnas en agent som inte är paintable?
107 agent.paint(g);
110 // Refresh the game view
111 view.repaintGame();
113 // Try to keep a given number of frames per second.
114 try {
115 Thread.sleep(1000 / FRAMES_PER_SECOND);
116 } catch (InterruptedException e) {
117 System.err.println("Error in thread, exiting.");
118 return;
124 /* Connect listeners to View *************************************/
126 private void connectListeners() {
127 this.view.addMapListener(new MapListener());
128 this.view.addClosingListener(new ClosingListener());
131 /* Inner Listener classes ****************************************/
133 private class MapListener extends MouseAdapter {
134 @Override
135 public void mouseClicked(MouseEvent me) {
136 final int x = me.getX();
137 final int y = me.getY();
139 // SwingUtilities.invokeLater(new Runnable() {
140 // public void run() {
141 // }
142 // });
143 Map map = model.getMap();
144 final MapSquare square = map.getMapSquareAtPoint(x, y);
145 logger.info("Mouse clicked @ (" + x + ", " + y + ")");
146 logger.info("MapSquare @ " + square);
147 square.click();
148 view.updateBackgroundImage();
149 //if (square instanceof StartSquare) {}
150 //if (square instanceof TurnSquare) {}
154 private class ClosingListener extends WindowAdapter
155 implements ActionListener {
156 public void actionPerformed(ActionEvent ae) {
157 logger.info("Closing program");
158 System.exit(0);
161 @Override
162 public void windowClosing(WindowEvent we) {
163 logger.info("Closing program");
164 System.exit(0);