2 * Copyright (c) 2002 Erik Rasmussen - All Rights Reserverd
4 package appletbots
.balls
;
6 import appletbots
.World
;
7 import appletbots
.geometry
.Vector
;
8 import appletbots
.Applet
;
11 import javax
.swing
.event
.ChangeEvent
;
12 import javax
.swing
.event
.ChangeListener
;
14 import java
.util
.Hashtable
;
17 * An applet to run a KickerAgent simulation
19 * @author Erik Rasmussen
21 public class BallsApplet
extends Applet
24 * The maximum number of agents allowed
26 public static final int MAX_NUM_AGENTS
= 50;
28 * The minimum number of agents allowed
30 public static final int MIN_NUM_AGENTS
= 1;
32 * The number of agents
34 protected int numAgents
= 10;
36 * The "Number of Agents" slider
38 protected JSlider numAgentsSlider
;
40 * The "Number of Agents" label
42 protected JLabel numAgentsLabel
;
44 * The maximum agent sight value allowed
46 public static final int MAX_AGENT_SIGHT
= 100;
48 * The minimum agent sight value allowed
50 public static final int MIN_AGENT_SIGHT
= 5;
52 * The agent sight value
54 protected int agentSight
= 60;
56 * The "Agent Sight" slider
58 protected JSlider agentSightSlider
;
60 * The "Agent Sight" label
62 protected JLabel agentSightLabel
;
64 * The maximum number of balls allowed
66 public static final int MAX_NUM_BALLS
= 5;
68 * The minimum number of balls allowed
70 public static final int MIN_NUM_BALLS
= 1;
74 protected int numBalls
= 2;
76 * The "Number of Balls" slider
78 protected JSlider numBallsSlider
;
80 * The "Number of Balls" label
82 protected JLabel numBallsLabel
;
84 * The maximum allowed ball mass
86 public static final int MAX_BALL_MASS
= 100;
88 * The minimum allowed ball mass
90 public static final int MIN_BALL_MASS
= 5;
94 protected int ballMass
= 10;
96 * The "Ball Mass" slider
98 protected JSlider ballMassSlider
;
100 * The "Ball Mass" label
102 protected JLabel ballMassLabel
;
105 * Initializes the world with the appropriate number of balls and
106 * KickerAgents with the appropriate "agent sight" settings
108 * @return A world with KickerAgents
110 protected World
initializeWorld()
112 final World world
= new World(300, 300);
115 for (int i
= 0; i
< numBalls
; i
++)
116 world
.addObject(new Ball(10, ballMass
, Color
.red
), Vector
.getRandom(5));
117 for (int i
= 0; i
< numAgents
; i
++)
118 world
.addObject(new Kicker(5, agentSight
, 5, 3));
128 * Returns a settings panel with "Number of Agents", "Number of Balls",
129 * "Agent Sight", and "Ball Mass" sliders
131 * @return A settings panel with "Number of Agents", "Number of Balls",
132 * "Agent Sight", and "Ball Mass" sliders
134 protected JPanel
getSettingsPanel()
136 final JPanel settingsPanel
= new JPanel();
137 settingsPanel
.setLayout(new BoxLayout(settingsPanel
, BoxLayout
.Y_AXIS
));
139 numAgentsLabel
= new JLabel("Number of Agents: " + numAgents
);
140 numAgentsLabel
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
141 settingsPanel
.add(numAgentsLabel
);
143 final Hashtable numAgentsLabels
= new Hashtable();
144 numAgentsLabels
.put(new Integer(MIN_NUM_AGENTS
), new JLabel(Integer
.toString(MIN_NUM_AGENTS
)));
145 numAgentsLabels
.put(new Integer(MAX_NUM_AGENTS
), new JLabel(Integer
.toString(MAX_NUM_AGENTS
)));
147 numAgentsSlider
= new JSlider(MIN_NUM_AGENTS
, MAX_NUM_AGENTS
, numAgents
);
148 numAgentsSlider
.setLabelTable(numAgentsLabels
);
149 numAgentsSlider
.setPaintLabels(true);
150 numAgentsSlider
.addChangeListener(new ChangeListener()
152 public void stateChanged(final ChangeEvent event
)
154 numAgentsChanged(event
);
157 settingsPanel
.add(numAgentsSlider
);
159 agentSightLabel
= new JLabel("Agent Sight: " + agentSight
);
160 agentSightLabel
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
161 settingsPanel
.add(agentSightLabel
);
163 final Hashtable agentSightLabels
= new Hashtable();
164 agentSightLabels
.put(new Integer(MIN_AGENT_SIGHT
), new JLabel(Integer
.toString(MIN_AGENT_SIGHT
)));
165 agentSightLabels
.put(new Integer(MAX_AGENT_SIGHT
), new JLabel(Integer
.toString(MAX_AGENT_SIGHT
)));
166 agentSightSlider
= new JSlider(MIN_AGENT_SIGHT
, MAX_AGENT_SIGHT
, agentSight
);
167 agentSightSlider
.setLabelTable(agentSightLabels
);
168 agentSightSlider
.setPaintLabels(true);
169 agentSightSlider
.addChangeListener(new ChangeListener()
171 public void stateChanged(final ChangeEvent event
)
173 agentSightChanged(event
);
176 settingsPanel
.add(agentSightSlider
);
178 numBallsLabel
= new JLabel("Number of Balls: " + numBalls
);
179 numBallsLabel
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
180 settingsPanel
.add(numBallsLabel
);
182 final Hashtable numBallsLabels
= new Hashtable();
183 numBallsLabels
.put(new Integer(MIN_NUM_BALLS
), new JLabel(Integer
.toString(MIN_NUM_BALLS
)));
184 numBallsLabels
.put(new Integer(MAX_NUM_BALLS
), new JLabel(Integer
.toString(MAX_NUM_BALLS
)));
186 numBallsSlider
= new JSlider(MIN_NUM_BALLS
, MAX_NUM_BALLS
, numBalls
);
187 numBallsSlider
.setLabelTable(numBallsLabels
);
188 numBallsSlider
.setPaintLabels(true);
189 numBallsSlider
.addChangeListener(new ChangeListener()
191 public void stateChanged(final ChangeEvent event
)
193 numBallsChanged(event
);
196 settingsPanel
.add(numBallsSlider
);
198 ballMassLabel
= new JLabel("Ball Mass: " + ballMass
);
199 ballMassLabel
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
200 settingsPanel
.add(ballMassLabel
);
202 final Hashtable ballMassLabels
= new Hashtable();
203 ballMassLabels
.put(new Integer(MIN_BALL_MASS
), new JLabel(Integer
.toString(MIN_BALL_MASS
)));
204 ballMassLabels
.put(new Integer(MAX_BALL_MASS
), new JLabel(Integer
.toString(MAX_BALL_MASS
)));
206 ballMassSlider
= new JSlider(MIN_BALL_MASS
, MAX_BALL_MASS
, ballMass
);
207 ballMassSlider
.setLabelTable(ballMassLabels
);
208 ballMassSlider
.setPaintLabels(true);
209 ballMassSlider
.addChangeListener(new ChangeListener()
211 public void stateChanged(final ChangeEvent event
)
213 ballMassChanged(event
);
216 settingsPanel
.add(ballMassSlider
);
218 final JLabel changes
= new JLabel("Changes will take");
219 changes
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
220 final JLabel takeEffect
= new JLabel("effect at next reset");
221 takeEffect
.setAlignmentX(java
.awt
.Component
.CENTER_ALIGNMENT
);
222 settingsPanel
.add(changes
);
223 settingsPanel
.add(takeEffect
);
224 return settingsPanel
;
228 * The method invoked when the "Number of Agents" slider changes
230 * @param event The change event
232 public void numAgentsChanged(final ChangeEvent event
)
234 numAgents
= numAgentsSlider
.getValue();
235 numAgentsLabel
.setText("Number of Agents: " + numAgents
);
239 * The method invoked when the "Agent Sight" slider changes
241 * @param event The change event
243 public void agentSightChanged(final ChangeEvent event
)
245 agentSight
= agentSightSlider
.getValue();
246 agentSightLabel
.setText("Agent Sight: " + agentSight
);
250 * The method invoked when the "Number of Balls" slider changes
252 * @param event The change event
254 public void numBallsChanged(final ChangeEvent event
)
256 numBalls
= numBallsSlider
.getValue();
257 numBallsLabel
.setText("Number of Balls: " + numBalls
);
261 * The method invoked when the "Ball Mass" slider changes
263 * @param event The change event
265 public void ballMassChanged(final ChangeEvent event
)
267 ballMass
= ballMassSlider
.getValue();
268 ballMassLabel
.setText("Ball Mass: " + ballMass
);