Es müssen nun die in Sim.idl definierten Attributstypen auf Ihre
Bedeutsamkeit für Bewegung und Fressen hin untersucht werden. Hier ein
Auszug aus der Datei:
//Sim.idl
...
/** all external known attribute types of objects */
enum AttrType {
Kind, Size, Visibility , Armor, Attack, Reserve,
Fitness, Sugar, Carbohydrate, Protein, Weight, Water
};
/** datatype for attribute values */
typedef double AttrValue;
/** datatype for attribute */
struct Attr {
AttrType Type;
AttrValue Value;
};
typedef sequence<Attr> AttrList;
...
Es wird nun zwischen festen und veränderlichen Attributen
unterschieden: Attribute wie Kind und Size sind sicherlich
fest, während z.B. die Nahrungswerte sich während des Lebenszyklus
eines Insekts ständig ändern. Bei den veränderlichen Attributen wird
noch einmal zwischen primären und abgeleiteten Attributen
unterschieden, wobei die Attribute Sugar, Carbohydrate,
Protein und Water primär sind und Weight und Fitness sich aus den anderen Attributen ableiten. setAttrib-Methoden sind damit nur für die 4 primären
Nahrungswert-Attribute erlaubt, während die abgeleiteten Attribute
lediglich fertig berechnete Vereinfachungen darstellen.
Die jeweils für verschiedene Aspekte, z.B. Bewegung (Mover) oder
Essen (Eater), notwendigen Modifikationen und Berechnungen der
Attribute, die nicht mit der Kommunikation mit anderen Objekten
verwoben sind, werden wo immer möglich in entsprechende
Berechnungsobjekte ausgelagert. Diese sind im Folgenden: | Name | Funktion | zugehöriges process... |
| kooperiert mit: | ||
| Eater | Essen | tryEat() |
| Fighter | Kämpfen | tryAttack() |
| Holder | halten und bewegen anderer Objekte | tryHold() |
| Looker | Beobachten anderer Objekte | getAttr() |
| Mover | eigene Bewegung | Physical::Thing |
| Observer | Benachrichtigung bei spezifizierten | self->getAttr() |
| Attributsänderungen |