今日の進捗 ~NPCの視界制御、完成~
NPCの視界の設定になんとか成功しました。
以下開発メモです。
プレイヤーが視界内にいるかの判定
まずNPCとプレイヤーの距離を算出。
それぞれの座標を取得して、プレイヤー座標とNPC座標の差を求める。
その値の絶対値が距離である。
設定した視界 得られた視界を色分け。
次に視界の設定。
距離の値がX,Y座標で(2、4)の場合、視界は2×4の長方形の形を取る。
その形を基準に、条件分岐で視界の形を整えていく。
また、NPCの向きとプレイヤーの位置などで条件を変更。
残りの方向に対しても同様の処理をする。
ここまでの処理をプレイヤーを認識するまで繰り返し、プレイヤーを認識したら、以降の処理で壁があるかを判定する。
壁の認識
赤丸で囲んだ地形を壁と認識させる。
まず「データベース」→「タイルセット」セットから、壁(=視界を切らせたい障害物)にしたいタイルの、「地形タグ」を1以上に変更する。
精度を高めるために座標を入れなおして、壁認識用の座標を取得。
座標の入れなおしは省いてもいいかもしれません。
Y軸上方向(マイナス方向)の壁を認識するために、先ほど取得した壁認識用のY座標を上に飛ばす(Y座標をマイナス1する)
目の前に視界ビームを飛ばしてるイメージ?
視界ビームを飛ばした先にプレイヤーがいる、すなわち壁認識用の座標とプレイヤーの座標が等しい場合は、プレイヤーを発見した処理へ。
プレイヤーがいない場合、目の前の地形タグを取得する。
地形タグが0(=障害物がない)場合は更にマイナス1して、もう一マス前に視界ビームを飛ばす。
地形タグが、先ほど設定した1以上のタイルだった場合、壁を認識。
視界ビームを飛ばすマスを垂直にずらして、同様の処理を繰り返す。
画像の場合だと、左一マスずらす処理へ進む。
座標を左に一マスずらす(=X座標をマイナス1)した後で、また視界ビームを飛ばす。
プレイヤーを発見したら発見の処理へ。
壁を認識したら今度は右にずらす。
壁がなかったら更に視界ビームを飛ばす……
これを上下左右全ての方向に対して行う。
つまり「自分の縦横三マス分全てに視界ビームを飛ばす」ことになる。(プレイヤーが壁の奥側にいる場合)
そうして最後の視界ビームと飛ばし終えたら、視界内にプレイヤーないないということで、距離を算出するところから繰り返す。
この際、視界ビームを飛ばす回数やずらす範囲で、さらに視界を細かく設定できます。
今回だと、視界ビームは四マス先まで飛ばして三マス広がるように設定。
視界は画像の色分けした通りになります。
視界と壁認識、実装動画
画像だけだと分かり難いので、実装したところを動画に。
今の所不具合なく動いてます。
今後の課題としては、
・二体以上に視界を持たせる場合、管理が非常にめんどくさい。
・上下左右方向に対応させるので視界の設定が複雑。時間がめっちゃかかる。
これらの点を改良していきたいです。
参考動画
本システムを作成するにあたり、ニコニコ動画でよあひむさんが公開している動画「【RPGツクールVX Ace】RPGツクールでつくーるよ 14【ゆっくり実況】」を参考にさせていただきました。
視界の説明に関してはここの説明より100倍分かりやすいです。
以下ニコニコ動画のリンク
https://www.nicovideo.jp/watch/sm20461074