ゲームオブジェクト設計の変遷(つづきのつづき)




● 成熟期(かどうかは分らないけど現況)
3種類の主要な機能を司るクラスと、データ構造を定めているクラスとの継承関係を断ち切り、それぞれの継承ツリーを独立させた。断絶された部分はコンポジションによって接続を保っている。また、3種類の機能を司るクラスは管理クラスからのイベントを取得するインターフェイスを提示する部分(例:Interactiveクラス)と、EntityやGhostの実装に依存する具体的な実装部分(例:InteractionApplierインターフェイスを実装する具象クラス群)とに分割した。インターフェイス提示部と実装部とは集約関係にある。

各具象エンティティクラスはまず大枠として3種類の内から必要な機能のインターフェイス提供部をメンバとして持ち、さらに各自のコンストラクタ内等でそれぞれ必要な実装をインターフェイス提供部へ登録することになる。例えばシャウトメッセージを外部へ送信できるだけのエンティティを構築するような場合には、


class Shouter : public Entity
{
public:
Shouter() { m_exportable.AddItem(new ExporterItemShout()); }
private:
Exportable m_exportable;
};
のようなコードが必要になる。
各具象エンティティクラスは自分が受け取りたいイベントにだけ反応できるように、動的で詳細な設定が可能になった。例えば店子のような歩かないキャラクタは移動のパケットを投げたり受け取ったりするための実装を登録せず、現座標を申告する機能だけを登録するような細かな機能の取り付け取り外しが可能になっている。

エンティティの管理側に対しては、以下のような偽ダイナミックキャスト機構を用意してやることで、今回の変更で各具象エンティティクラスの内部にしまわれてしまった3つの機能を司るクラスへとイベントが届く仕組みになっている。