或曰

木曜日, 1月 03, 2008

GameObj: ヒット判定

ヒット判定の設計と実装。考えるポイントは 1. ヒット判定を誰がどのように行うか、それから 2. ヒットしていることが判明した場合の処理をどうするか。

ヒット判定用にインターフェース IHitter, IHittable を用意し、それだけを用いてヒット処理を行う HitManager クラスを作成。インターフェースを細分化して、依存関係を極力減らしておく。
ヒット時にはヒット側から被ヒット側に宛てたメッセージをキューにポストし、後で被ヒット側が実行されるタイミングでキューからメッセージを取り出して処理する方針で。
一般的に、複雑な状態を持つオブジェクトに対して外から不特定のタイミングで状態を変更させるとハンドリングが難しくなるので、そのオブジェクトが自発的に処理するようにした方が楽 (たとえば POSIX スレッドライブラリの API pthread_cancel() とか UNIX プロセスに送られたシグナル処理も似たような方法を使っている)。

そのへんまで方針を決めたら、UML モデリングツールを使ってクラス図を描いて検討し、だいてい行けそうだとなったらシーケンス図も起こしてみる。



だいたい行けそうだとメドが立ったところでコーディング始めて、最後に今後のためにドキュメントをコードにあわせて修正しておしまい。

私は C でプログラムを書く場合にはドキュメントはそれほど重視しないけど、C++ だと多少書いておく。C++ でインターフェースを細分する書き方をしていると必然的に基底クラスの仮想関数を介しての呼び出しが増えるため、ソースコードだけだと後で見て実際にどの関数が呼ばれているかを追うのが大変になるので。

あと Visual C++ 2008 Express Edition で動くように一部修正。_com_ptr_t も使えるのね。

ラベル:

2 件のコメント:

  • このページ、ブラウザがエラーになりますよ。

    Out of memory at line: 44
    Stack overflow at line: 1590
    Stack overflow at line: 1590
    Stack overflow at line: 1590
    ...

    IE 6.0 SP2

    出先の IE でも同様。

    Anonymous 匿名 さんのコメント, 10:32 午後 に投稿  

  • ほんとだ。Firefoxだとエラーが出ないので気づきませんでした。

    テンプレート初期化してみました。

    Blogger issei さんのコメント, 10:52 午後 に投稿  

コメントを投稿



この投稿へのリンク:

リンクを作成

<< ホーム