『花火』でゲームシステムを考える

AS3の文法を覚えたはいいものの、どうやってゲームを作ればいいのかというとき、
ひとつ、プログラムの土台となるシステムを覚えればかなり楽になります。
僕は今まで、タスクシステムと思われる手法でやってきましたが、何やら別の方法があるようなので、『花火』を作る際に試してみました。
今回はそのシステムについていろいろ考えてみます。


『花火』のソースをページの下の方に置いておきましたので、よろしければご覧ください。
http://www.geocities.jp/ahiufomasao/flash/game/StarFireworks/StarFireworks.html


参考サイト様は以下。
http://www.issei.org/blog/archives/000225.html


僕は物事をさっと理解するのが苦手なので、一個一個吟味してみる。

なんでもかんでも単一のリストに繋ぐと型システムに穴が開くし、

『爆裂スライムシ』、『Sword』、『Double Party!』ともに単一リストにぜ〜んぶ登録してやってました。
それぞれのオブジェクトに、グループ属性として一つ変数を持たせ、そのインスタンスが何であるかを判断できるようにしてました。
いわば、こういった識別用変数を持たせなければならない時点で、型システムに穴があるということなんでしょうか?

エンティティ間の依存関係や相互作用をコードに陽に記述できなくなる。

これはインスタンス同士でデータの参照やらがやりにくいということ?
そうだとすると非っ常によく分かります。
特に『Double Party!』だと、プレイヤーが他のインスタンスへの参照を持たせてたりしました。
どうもこういうやり方はよろしくない様子。
単一リストに登録するだけではインスタンス同士を関わらせるのはあまり簡単ではありませんでした。


で、今回『花火』で、上記参考サイトのサンプルコードにのっとって頑張ってみました。


最初に、MainManagerクラスを作ります。
あとは以下の流れを繰り返す。

  1. 例えばプレイヤーを作る場合、Playerクラスを作って、同時にIPlayerContextインターフェースも作ります。
  2. MainManagerクラスにIPlayerContextを継承させておきます。
  3. MainManagerはPlayerクラスのインスタンスを作成し、exec関数をPlayerContext型の引数として自分自身を渡してループ実行します。

こうしておけば、

自エンティティで完結しない処理を行う際

例えば、花火を打つ処理を行いたい場合、

  1. PlayerContextインターフェースに、花火を打つ関数を定義する。
  2. MainManagerクラスに1の関数を実装する。
  3. Playerクラスのexec関数内で、引数のPlayerContext型の変数を介して2の関数を実行する。

とすることで、MainManagerが花火を作成してくれます。
(Playerクラスで花火を作ればいいのでは?ということなんですけども、
花火を作成、花火の実行リストと描画リストに登録という作業をするには、Playerクラスだけでは完結しないと。)


花火クラスを作成する場合も、Playerクラスと同様、花火コンテキストを作り、MainManagerに継承させる。
星とのあたり判定を行う場合(花火クラス内では完結しない)
花火コンテキストに当たり判定関数を定義、MainManagerに当たり判定関数を実装、花火クラスのexec関数内で実行...という流れです。


これが

マネージャから各エンティティに選択的に機能を公開できる上、各エンティティの実行タイミングならびにマネージャ側の情報提供タイミングも明確になる。

ということかも。


印象としては、MainManagerに負荷が集まって、膨れます。
『花火』程度の小規模なものなら大丈夫でしたが、大きくなるとなかなか大変そうです。
多分、

ここのエンティティの振る舞いが複雑になってきたら、マネージャを多段に噛まして、メッセージを転送しても良い。

と関わっている部分かと。
しかし、ここの内容がよく分かりません...。
多段に噛ますということは、

MainManager
┣ PlayerManager
┣ StarManager
・
・

みたいに、マネージャーに子マネージャーを持たせて...ということ?
PlayerManagerを作る際、同時にIPlayerManagerContextを作って、
IPlayerContextをPlayerManagerに継承させ、
IPlayerManagerContextをMainManagerに継承...みたいな感じ??
これは一回試してみるべきでしょうか。


今まで、インスタンス同士を効率よく関連させることに苦しんできましたので、今回のはなかなかよさそうです。
これでもうちょっといろいろ作ってみます。


なんかまとまりませんが、以上。


# なんか誤解してるようでしたら、ご指摘下さい。


# 追記(2008/06/27)
まだ分かっていませんでした。
まだちゃんと分かってない。例のゲームシステム。 - 書き物