KDTree のデモシーン作成(巫女&築城&防衛ゲーム)
オープンソースの KDTree を使ったデモを作成します。
やること
最も近くて射線の通る攻撃対象を選ぶ
ものすごく簡単に言うと KDTree が提供してくれる機能は「最も近い対象を見つけてくれる」です。今回は、これを用いて味方の部隊と敵の部隊とで互いの攻撃対象を決める処理について、どうするか考えます。
ゲームでは KDTree でユニットが敵を攻撃できるかの判定を行う予定で、
- KDTree の Closest() で最も近い対象を得る。
- 得られた対象が射程外の位置だったら処理を終わる。
- Raycast で射線判定を行い、射線が通らなかったらこの対象を無効にする。
という判定を、近い順に行います。
これによって、射線が通る最寄りの攻撃対象を取得します。
攻撃してきた相手に反撃する
今回作るデモとは関係ないのですが、反撃について仕様を決めます。
アイディアを列挙すると
- 攻撃されたとき、攻撃してきた相手を攻撃目標にする。
- 既に攻撃目標がいるときには影響を受けない。
- このとき、周囲グリッドの味方の攻撃目標も同様に変える。
くらいでしょうか。
基本的に敵味方は群れで移動するのを想定しているので、側面から攻撃されると攻撃されたユニットと周囲とがそっちに移動しつつも、他のユニットは本来の経路を移動しつづけるような動きになると思っています。
このあたりは動作させからまた考えます。
やったこと
作るデモの仕様
KDTree を使って近い攻撃対象を探索するデモを作成します。
実現したい動作は、
- 攻撃対象が適当に配置されて円の軌跡を移動し続ける。
- 適当に配置した位置から、最も近い対象を選んでわかるように描画する。
くらいです。
そして、作ったものがこれ↓です。最寄りの3つの対象に直線を描画しています。
思った通りに動作していて、大変よいです。
1番目に近いもの、2番目に近いもの、という処理を実現するために、KDTree の QueryClosest() を修正したりもしました。オープンソースは変更できるので、とても助かります。
まとめと今後の予定
オープンソースの KDTree を利用して近い位置の対象を検索するデモを作成しました。よいです。
小難しい処理の動作確認が終わったので、次回は今後の開発をどうするか少し考えたり、その開発が小難しくならないように仕様を決めていきたいと思います。がんばります。