It is frequently
desirable to have agents perform some sort of interaction when they
collide. The agents might exchange information, fight or reproduce, for
example. In order to specify what happens when a collision occurs, use
the method handle-collisions found in Real.tz. This method expects a string
method name, which is the method that will be
invoked when the collision occurs, and a string
type, which specifies the class name to set up
the handler for.
The handler method must accept a single argument, of type object
. When a collision occurs, the method is called
with the object that was encountered. In the following code excerpt,
for example, an agent defines a method called "setup-collision-handler"
to setup a collision handler for a (fictional) class called "Food".
When the agent collides with a piece of food, the method "eat" will be
called, and the argument passed in is the piece of food with which the
agent has collided:
+ to setup-collision-handler: self handle-collisions with-type "Food" with-method "eat". + to eat foodObject (object): print "I just ate $foodObject. It was yummy.". free foodObject.
If two agents collide, and both have collision handlers setup, then the collision callbacks are not guaranteed to be executed in any particular order. It is sometimes desirable for both objects to execute their callbacks, while in other cases, only one agent should execute the callback. If the callback is expected to trigger a one-time interaction (like a fight) for example, then you don't want to allow the callback to be executed for both agents. In this case, make your collision handler return a positive number. If the first callback method returns a positive number, then the second callback will not be executed. If the callback returns zero, or doesn't return a value at all, both callbacks will be executed.