With the model swarm defined, arranging for a graphical observer Swarm is the next step. For Heatbugs, the code is in HeatbugObserverSwarm. The structure of an observer swarm is almost exactly like building a model swarm.
@interface HeatbugObserverSwarm : GUISwarm {
int displayFrequency; // one parameter: update freq
id displayActions; // schedule data structs
id displaySchedule;
HeatbugModelSwarm * heatbugModelSwarm; // the Swarm we're observing
// Lots of display objects. First, widgets
XColormap * colormap; // allocate colours
ZoomRaster * worldRaster; // 2d display widget
EZGraph * unhappyGraph; // graphing widget
// Now, higher order display and data objects
Value2dDisplay * heatDisplay; // display the heat
Object2dDisplay * heatbugDisplay; // display the heatbugs
}
|
Again we have input parameters (display frequency), schedule data structures, and resident objects (model swarm, display widgets). The important exception is that HeatbugObserverSwarm is a subclass not just of the generic Swarm class, but specifically a GUISwarm. That implies that the HeatbugObserverSwarm will contain a control panel to allow the user to stop execution, and will also have a special go method to set everything running.