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
;
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
;
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
);
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:
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
{
65 // TODO Auto-generated method stub
71 List
<Agent
> agents
= model
.getAgents();
72 List
<Agent
> deadAgents
= new ArrayList
<Agent
>();
73 for (Agent agent
: agents
) {
74 if (agent
.isAlive()) {
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
) {
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");
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?
110 // Refresh the game view
113 // Try to keep a given number of frames per second.
115 Thread
.sleep(1000 / FRAMES_PER_SECOND
);
116 } catch (InterruptedException e
) {
117 System
.err
.println("Error in thread, exiting.");
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
{
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() {
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
);
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");
162 public void windowClosing(WindowEvent we
) {
163 logger
.info("Closing program");