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.