コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
スネーク ◆juShGa/LR2nc
2021/2/25 20:17
質問
ステルスゲームを作りたいです。
プレイヤーの位置を(x1,y1)、敵の位置を(x2,y2)
敵が見ている方角を、dir (0°≦dir<360°)
敵の視野(目に見える範囲)を、range (0°≦range<360°)
敵の視程(目に見える距離)を、dist とする。

このとき、敵の視界内にプレイヤーが存在するかどうか判断するにはどうすれば良いでしょうか。
初投稿、初心者です。宜しくお願い致します。

コメント

アバター
ツララ 2021/2/25 21:30 ◆ArUdBYOYME1V
障害物の影になってるとかの判定は考慮した方がいいです?
しなくてもいいのなら、まず距離で判定して距離的に範囲内ならば
次は敵の向いてる方向とプレイヤーの位置との角度の差を取る、みたく
二重の判定処理にしてみたらいいんじゃないんです?

スネークさんが最初に思い浮かべた方法くらい書いてくれると
もっと話がスムーズに進むと思うんですけど
他の人の提案を鵜呑みするだけじゃあ調べ物したりしない人なんじゃないかと思っちゃいますよ。
Hanzoさんがプチコン4でそのものズバリな処理を実装してる投稿作品ありますから
プチコン4をお持ちでしたら探してみて参考にしてみたらいいんじゃないかと。
公開キー[4XEKE8EHV]
アバター
スネーク 2021/2/25 23:50 ◆juShGa/LR2nc
こんなに早く返信頂けて嬉しいです!
貴重なアドバイス、本当にありがとうございます。
質問の仕方が稚拙であったこと反省しております。
実は色々試してまして、あまりにチンプンカンプンなもので、、
白紙に戻して、考えてもらおうという駄案に至りました。本当にすみません<m(__)m>
プチコン4未所持です。
試した内容と、分からない部分を書かせていただきます。
数学の知識は小中学生程度なので、お許し下さいm(_ _)m。


[試した内容]
プレイヤーと敵との距離は、 d = {(x1-x2)^2 + (y1-y2)^2}^0.5
まず、これと敵の視程を比較しました。if d <= dist then ...
次に、敵の視線を単位ベクトルの成分として、(x3,y3) = (sin(dir),cos(dir))で表現しました。dirは敵の向いている角度です。
さらに、プレイヤーとのベクトルを(x4,y4) = (x1-x2,y1-y2)で表現しました。
次に、これらのベクトルの内積を dot = x1 * x2 + y1 * y2
これのアークコサインで角度差を求めました。deg = acos(dot)
最後に、これと敵の視野を比較しました。if range > deg then ...
今回は敵の視野rangeは、30°にしました。
この2重の判定の上で、見つかったと表示させました。

[分からない部分]
 「距離的に範囲内ならば..」
 距離との関係はうまく作動しました.(^o^)

 「敵の向いている方向とプレイヤーの位置との角度差..」
 上記で試行したとき、敵が向いている方向(北っぽい方)ではなく、西っぽい方と東的な方の2つの範囲で「見つかった」の表示がされてしまいました。_| ̄|○ il||li

 「障害物の影..」
 プレイヤーと敵の座標を直線で結んで、その直線上に障害物の座標が存在するかどうかを調べれば良いと考えました。
しかし、障害物の大きさから、障害物の座標1点だけだと駄目なことに気づきました。(+_+)、

宜しくお願いします。
アバター
ugly777 2021/2/26 0:26 ◆B7lOIJDWuOqi
自分も未だに初心者で分からない場所もありますが、
ACOSで返ってくるのはラジアンなのではありませんか?
ちなみに、プチコン4を持っていなくてもSBAPIというツールで
公開キーのプログラムを見れますヨ!
http://sbapi.me/get/4XEKE8EHV/info
追記:
XがCOSでYがSINだったような…?
あと、SINとCOSにもラジアンを入れるようです。
ということで、
(X3,Y3)=(COS(RAD(DIR)),SIN(RAD(DIR)))
DEG=DEG(ACOS(DOT))
で良いと思います。多分。
アバター
あきと 2021/2/26 23:21 ◆qGd5dQw2g3a2
サンプルを作ってみました。
とりあえず公開キー【4KQP4X33】(差し替えました)
ファイル名「FAN_IN」です。

下画面中央に魔女がいてスティックで移動します。
他にも30個オブジェがランダム配置してあって、一本ランダムで線が引いてあります。
画面をタッチすると魔女から扇形の視界が描画されます。
視界にオブジェが入っていた場合、そのオブジェは赤くなります。壁で視線が遮られる場合はオブジェは赤くなりません(視界の扇形は壁を越えて描画してます)

・魔女とタッチ座標の角度をATANで取得して扇形を描画
・オブジェとの距離を取得して円周内にいるか判定
・視線の角度と魔女〜オブジェ間の角度が範囲内か(内積)
・魔女〜オブジェの線分が壁と交差しないか
の計算をしています

魔女の視線の角度とオブジェの角度をATANから取得して角度の差を取っていたんですが180度と-180度の境界を越えるところがうまくいかなかったので内積で判定する方法に変更しました
アバター
あきと 2021/2/27 17:23 ◆qGd5dQw2g3a2
スレ主さんの質問に答える返事としては
・(x1,y1)-(x2,y2)の距離がdist以内
・x3=COS(RAD(dir))*dist
y3=SIN(RAD(dir))*dist
で視線の先の頂点を算出して
(x1,y1)-(x2,y2)と(x1,y1)-(x3,y3)の
2つの線分の内積を取ってRANGE以内か判定
・壁は別に線分を持っているとして、敵と
自分の線分と壁の線分が交差していないか判定

これで視界に入っているかわかります。
サンプルもこの順番で判定しています
アバター
Na 2021/2/27 18:25 ◆QoELVrBXBQCI
>数学の知識は小中学生程度なので、お許し下さいm(_ _)m。
小中学生にはcosとか内積とかわからないのでは...

>180度と-180度の境界を越えるところがうまくいかなかった
角度の差が180を超える場合に360を引けばいいのでは。

x4=x1-x2: y4=y1-y2
deg=DEG(ATAN(y4,x4))-dir
IF deg>180 THEN deg=deg-360
IF deg<-180 THEN deg=deg+360

上の2つのIF文は
 deg=deg-360*(deg DIV 180)
とまとめて書くこともできます。
アバター
ツララ 2021/2/28 14:06 ◆ArUdBYOYME1V
精度をどれくらいにしたいかによるかもしれませんけど
別にサーチ範囲は扇型じゃなくてもいいんじゃ無いんです?
であれば、ベクトルを利用して三つの座標からその三角形内に求める点の座標があるかどうかを探る方法もありますから
そっち方面からのアプローチもありかも。
扇型に近づけたいなら分割数を増やせばいいですし。

スネークさんが重視したいのは”精度”と”処理スピード”のどちら寄りなのかが聞きたい。
あと、精度の範囲を大体決めちゃえば、範囲を三角形にしちゃえ的な色々な嘘が使えたりするんですけど。
エリアが通路で構成されているなら敵の視界はザックリと矩形で判定とか。
そういうのじゃなくて、キッチリと視線が通ってるかどうかでやりたいということならば
数学が苦手を口実に逃げてはダメですよ。
理解が追いつかなければ解説を要求すればいいんですから。



こちらとしてはスネークさんの試行錯誤の経緯の方に興味があるので
一段落したらチンプンカンプン頭ウニスパゲティーになった時の話も書いてちょ
アバター
スネーク 2021/3/1 23:54 ◆juShGa/LR2nc
皆様、返信ありがとうございますm(_ _)m
返信遅れてしまい、申し訳ございません。
プログラムが見れるサイトをご紹介してくださったり、
わざわざプログラムも作ってくださったり、本当に感謝しております!

>精度”と”処理スピード”
精度とスピードの件ですが、スピードですかね。
ミニゲーム的な感じで、ステルス的なものを感じることができるゲームになれば
まあ良いかなという感じです。
三角形で考えるなど、1つの考えに囚われないことが大切だなーと目から鱗です。

>試行錯誤
色んなサイトを参考にして、まず意味もわからず作ってみて
うまく行かないので、コードの内容を理解しようとして、
cosって何?内積って何?から始めたので、
わからないところが分からないという事態が頻発してます_(:3」∠)_
最終的には上の図が思い浮かんで、
アークコサインの値が変になるところが出たので、
内積の公式でベクトルの成分を分配法則みたいにかけ算して足すやつと、
ベクトルの大きさと、cos入った公式を使って、
ベクトル同士の間の角度を計算しようとしてcosの値がめちゃ大きい値になったり、、
まだまだ知識が足りないと感じました_| ̄|○ il||li
人の書いたプログラムも理解するのが難しく感じております今日このごろです。

皆様、ありがとうございました。
もっとプログラミングや数学の見聞を深めようと思います(^_^;)。
アバター
オワたず 2021/3/3 11:54 ◆w7BXxYlkW2NJ
質問と関係ないけど、質問者さんの名前もステルスで笑っちゃった

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -