Petitverse
ゲストさん (
ログイン
)
ログイン
コミュニティ内検索
コミュニティ一覧
Petitverse ご利用ガイド
Petitverse からのおしらせ
プチコン 非公式コミュニティ
トピック
reji
◆NbkrH.ADqKjI
2018/11/17 7:04
質問
線分の当たり判定
始点(x1,y1)から終点(x2,y2)に線分があるとき、線分上にブロック(BGチップ)があるかどうかを判定したいです。
どんな方法でもいいので何か思いついたら教えてほしいです!
自分で考えた方法では、線分の単位ベクトルを求めて、始点から終点まで伸ばしていき、その過程でブロックがあるかを判定しようと思ったのですが、これだと非効率的すぎると思うので(TдT)
コメント
こういち
2018/11/17 7:21
◆ou0jbJnEJ0Kb
参考になるか分かりませんが一応。
http://petitverse.hosiken.jp/community/petitcom/diary/?read=1738&ukey=0
こういち
2018/11/17 7:24
◆ou0jbJnEJ0Kb
もしもブロックが四角なら
その頂点をa,b,c,dとすると、
線分abとその線分の当たり判定
線分bcとその線分の当たり判定
線分cdとその線分の当たり判定
線分daとその線分の当たり判定
どれかが真なら衝突。
こういち
2018/11/17 7:32
◆ou0jbJnEJ0Kb
これだとブロック内に線分がある場合にうまくいかなくて、考え方を変える必要が出てきます。(ブロックに対して線分が十分に長いなら最初の方法で問題ない)
ブロックの頂点をa,b,c,d(abcdは時計回りに並んでるものとする。)
線分の始点をf,終点をlとすると。
ベクトルabとベクトルafの二次元外積
ベクトルbcとベクトルbfの二次元外積
ベクトルcdとベクトルcfの二次元外積
ベクトルdaとベクトルdfの二次元外積
の全てが正であるか、
ベクトルabとベクトルalの二次元外積
ベクトルbcとベクトルblの二次元外積
ベクトルcdとベクトルclの二次元外積
ベクトルdaとベクトルdlの二次元外積
の全てが正なら衝突。
あっ。これだと両方の点がブロックの外だと非衝突になる。
まぁ最初の方法とのORを取れば大丈夫ですが。(ただし二番目の方法は星形のようにへこみのある図形や点に対して使えない。)
みなつ
2018/11/17 8:41
◆hJTkStjweib1
当たるかもしれないブロックの候補が分かっていて、ほんとに当たるのかどうかを確かめたいという場合は、
・線分の始点に1ドットのスプライトを配置して、SPCOLVECで線分のX,Y方向の大きさを移動量として設定してから
(A)ブロックの位置に透明なスプライトを配置して、SPHITSPで判定
(B)もしくは、スプライトは配置せず、SPHITRCで確認したいブロックの位置と大きさを指定して判定
とかができるかもですねー(●´ω`●)
判定するブロックの候補の絞り込みは、例えば(x1,y1)-(x2,y2)の四角形に重なる範囲のブロック、とかできるかもー?@@;
しんいち
2018/11/17 13:11
◆lHy.hAWXbthn
スプライトで線を引くDEF。SはSPDEF画像の幅(高さは1)。これで引いたスプライトとブロックの当たり判定を行う。但しSPROTの角度は1度刻み(小数点無効)みたいなので粗い。ブロックが小さいとすり抜けるかも。
なので結局SPCOLVECが簡単で良いと思います^^;
SatoshiMcCloud
2018/11/17 14:05
◆Z1qfV11i63Jr
質問です。
BGの回転や拡大縮小を考慮する必要はありますか?
reji
2018/11/17 19:10
◆NbkrH.ADqKjI
こういちさん、みなつさん、しんいちさんコメントありがとうございます!
なるほど、参考になりました。
試行錯誤していき自分にあったやつを探していきたいと思います^^
satoshiMcCloudさん>回転とか拡大はしない予定です!
hanzo
2018/11/17 19:26
◆A6odzB/cEbps
目的にも依ると思いますが、例えば、壁にレーザーを照射したときに、壁にめり込んだり、壁を突き抜けたりしないようにレーザーを描画する目的で、みなつさん推奨方式を適用したことが、私はあります。
具体的には、SPCOLVECで指定するベクトルの長さを16ずつ※伸ばしてゆき、衝突が発生したら、今度はそこからベクトルの長さを1ずつ縮めてゆき、衝突が発生しなくなったら、その時点のベクトルの長さ=レーザーの長さ、とします。※BGチップのサイズが16×16の場合。チップサイズが8x8なら8ずつ、32x32なら32ずつ伸ばします。
この方式は、上述のようなレーザー長の決定以外に、「メタルギア」風のスニーキングゲームを作る際に、敵の視線ベクトル長の決定にも使えると思います。
reji
2018/11/17 20:02
◆NbkrH.ADqKjI
hanzoさん具体例を添えての解説ありがとうございます!
皆さんのおかげで解決しました!
ありがとうございましたm(_ _)m
コメントを書く
こちらは「プチコン3号」「プチコンBIG」など、
プチコンシリーズ
に関する話題を扱った
コミュニティです
プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
ユーザー登録なしで書き込みができます
秘密の合い言葉は成りすましの防止 (
トリップ機能
)、書き込みの編集時の本人認証に使用します
秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります
normal
happy
like
surprized
frustrated
puzzled
画像
ネタバレ
投稿する
-
WEB PATIO
-