781event.GetHealthPack() presumably returns a HealthPack game object,
which in turn we presume provides a member function called GetHealth().
This implies that the root Event class “knows” about health packs (as well as,
by extension, every other type of event argument in the game!) This is prob-
ably an impractical design. In a real engine, there might be derived Event
classes that provide convenient data-access APIs such as GetHealthPack().
Or the event handler might have to unpack the data manually and cast them
to the appropriate types. This latt er approach raises type safety concerns, al-
though practically speaking it usually isn’t a huge problem because the type
of the event is always known when the arguments are unpacked.
14.7.7. Chains of Responsibility
Game objects are almost always dependent upon one another in various ways.
For example, game objects usually reside in a transformation hierarchy, which
allows an object to rest on another object or be held in the hand of a charac-
ter. Game objects might also be made up of multiple interacting components,
leading to a star topology or a loosely connected “cloud” of component ob-
jects. A sports game might maintain a list of all the characters on each team. In
general, we can envision the interrelationships between game objects as one
or more relationship graphs (remembering that a list and a tree are just special
cases of a graph). A few examples of relationship graphs are shown in Fig-
ure 14.17.
14.7. Events and Message-Passing
Figure 14.17. Game objects are interrelated in various ways, and we can draw graphs depicting
these relationships. Any such graph might serve as a distribution channel for events.
Attachment
Graph
Event1Event 3Component
GraphEvent2Team
GraphTeamEvan CarterQuinn CooperObjectAComponentA 1 ComponentA 2ComponentA 3Vehicle Character Weapon Clip