SyntaxHighlighter

2012年2月14日火曜日

敵の動きの追加

最も単純なAIを実装した。

【アルゴリズム】
a.敵プレイヤー間の距離が一定の範囲内である
b.敵プレイヤー間に射線が存在する(間に壁が無い)
・条件aかつbを満たした時、敵はプレイヤーに向かって移動する

敵をすり抜けられないので、敵の移動速度が速いとあっさり囲まれる
条件aの実装は割と簡単。b2Distance関数に両者の座標を入れるだけ。
条件bの調査にはb2WorldクラスからRayCast関数を呼べばいいのだけど、その引数のb2RayCastCallbackクラスがちょっとやっかい。

いつか書いたb2QueryCallbackクラスと同様にb2RayCastCallbackクラスはインターフェイスなので、自前でMyRayCastCallbackクラスを書く必要がある。



この純粋仮想関数は、b2WorldのRayCastから呼ばれると始点から終点にかけてb2Fixtureを発見する度に呼ばれる。つまりループに組み込まれるのである。ループを終わらせたい場合は0.0fを戻し、走査を続けたい場合は0.0fより大きい正の数(普通は1.0f)を戻せばいい。条件bのようなことをしたい場合は、RayCast関数の始点終点を敵とプレイヤーに設定し、ReportFixture関数の引数に壁オブジェクトが含まれることがあるかどうか調べればいい。
大体そんな感じで実装した。

ただ、奇妙な問題が発生した。上の画像のものは両者間の距離が最短5.0m~最長50.0mの範囲にあるときに接近する、と設定したのだけど、実際はかなり密着している。これは外側の敵が内側の敵を押し込んでいるためである。

ただの赤丸でしかない敵だけど、動きを加えたらなんだか可愛く思えてきた今日この頃。

0 件のコメント:

コメントを投稿