ページ 11

裏画面での当たり判定

Posted: 2012年2月03日(金) 23:51
by RYO
初めまして、最近DXライブラリを知りC++を使って色々試しているのですが、自分はポトリスのような

制御をしたいと思っており、画面にMAPを書いてそこにキャラクタを移動させ、当たり判定には色を

取得して黒なら進めないという具合にしております。

ですが、このままだと背景や、地面が削れた場合の処理でうまくいかないのは、分かっているのです

が、一度どこかで、実際の画面と裏画面を使って、当たり判定をしている方法があるのを知り、それを

実践したいのですが、裏画面を2枚もつ方法があるのか、または、ScreenFlip()をするまでに、裏画

面で処理してから、画面に出すのかどちらがいいのでしょうか?。

初心者の質問ですいません。よろしくお願いします。

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 00:21
by softya(ソフト屋)
始めまして。
過去に何回かRYOさんと言う方に回答しているのですが別の方ですよね?
出来れば名前をユニークなものしてもらうと相手を間違わないので助かります。ご検討下さい。

さて、ご質問の内容ですが画面バッファから色を取得する方法は処理が遅いとか表示タイミングとズレるなど問題が多数あります。
なので、普通ゲームの場合は当たり判定や移動不能判定は座標で行うのが一般的です。なので背景画像とは別に当たり判定データを持つ必要があります。
もっとも簡単で高速なのはマップをブロックに区切りブロック単位で当たりを持つ方法で配列で定義します。

参考。
「29.アクションゲームにおけるマップとの当たり判定基本」
http://homepage2.nifty.com/natupaji/DxL ... Sample.cpp

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 00:41
by RYO改め、RYOkunで(笑)
早速のお返事ありがとう御座います。

自分もマップチップによる判定も、考えて見たのですがそうすると、爆破によって地形が変化し

そこに進むと、キャラの表示角度が変わる、、また爆破しながら、地面または壁に穴を掘り続ける。

ポトリスをした事がある人ならば、分かると思うのですが、(参考:動画

爆破によって削れる地形は、爆破のパターンで画像(地形)を排除しているため、小さなドットが残っても当たり判定となるといった処理なのです。

なので、複数の爆破跡のマップチップに置き換える方法も使えないと思っております。

自分の想像なのですが、初期のMAPに当たり判定として同じ形のMAPのマスクを作って、形が変わった所だけを再度マスクして・・画面に出すと思っているのですが。。。どうでしょうか??

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 01:01
by softya(ソフト屋)
ピクセル単位の当たり判定専用の画面をMakeScreenで作るという方法はあります。
判定専用の画面には白黒で地形だけ描画して当たり判定参照すればよいかと思いますが、本当に1ピクセル単位で当たり判定が必要なのでしょうか?
そにままだと重いと思いますよ。 1/2サイズや1/4サイズにするなど工夫することも出来ます。

どちらにしろ、敵味方が多数出て一番ピクセルを多く調べなければいけないときにどのぐらいの重さに成るか調べてみて実用になる方法なのか調べてからのほうが良いと思います。

[補足]ポトリスは名前と静止画ぐらいしかりませんでしたが動画を見るかぎりドット単位の当たり判定なのかは疑問があります。

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 14:18
by RYOkun
お返事、ありがとうございます。

MakeScreenというのは、知りませんでした。

一度調べて使えるのか試してみたいと思います!

ありがとうございました!

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 18:30
by ISLe
ピクセル単位の当たり判定は、パターンごとにビット単位のマスクデータを用意して、背景用にはふつうに整数型の配列を用意して随時更新し、背景と論理積を取って0以外なら当たった、というふうに処理できます。

いまどきのハードには相性の良くない手法ですけど、おおむかしのゲームではやってたことなので極端に重い処理では無いと思いますよ。

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 19:38
by RYOkun
ご返答ありがとうございます。

まだまだ初心者なので、理解するまでに時間がかかりそうですが・・・おそらく画面分の要素をビット

単位で、当たり判定用で持っておき、判定の際に描画座標から、論理積で判定するということでよろ

しいでしょうか?。もしそうであれば、自分の悩んでいる所を申し上げますと、破壊された地形(描画

先の地面の画像など)を、当たり判定用の配列に反映しておく。爆破パターン(画像)分を先に作っておき、判定用の座標から、当たり判定分の短形分を取り出し爆破分の要素で埋めるという手法でいいのか。。。または、もっと効率のいい方法があるのか。。

解決済みなのに、すいません。m(__)m

Re: 裏画面での当たり判定

Posted: 2012年2月04日(土) 21:43
by softya(ソフト屋)
RYOkun さんが書きました:まだまだ初心者なので、理解するまでに時間がかかりそうですが・・・おそらく画面分の要素をビット
単位で、当たり判定用で持っておき、判定の際に描画座標から、論理積で判定するということでよろ
しいでしょうか?。もしそうであれば、自分の悩んでいる所を申し上げますと、破壊された地形(描画
先の地面の画像など)を、当たり判定用の配列に反映しておく。爆破パターン(画像)分を先に作っておき、判定用の座標から、当たり判定分の短形分を取り出し爆破分の要素で埋めるという手法でいいのか。。。または、もっと効率のいい方法があるのか。。
解決済みなのに、すいません。m(__)m
ビットでピクセルごとの当たり有無を持つ場合は論理積でビットを判定すれば地形有無の判定が出来ます。
爆破パターンは、地形ビット配列に論理積を行うだけです。ただ、座標が変わるのとビットがずれるので論理積を掛けるビットパターンは座標に合わせてシフト演算などを必要とします。

ビット配列の作成。最初に作っておけば毎フレーム作る必要はない。
通れる所:0 通れない所:1とした場合。
地形画像 → 1ピクセルずつ取り出して通れる所:0 通れない所:1のビット値にして地形ビット配列に格納する。
爆破パターン画像 → 1ピクセルずつ取り出して残る所:1 崩す所を0として爆破パターンビット配列に格納する。使う時は座標に合わせてシフトを行なって使用する。

Re: 裏画面での当たり判定

Posted: 2012年2月05日(日) 00:14
by ISLe
爆破パターンのマスクを反転して、記録してある背景マスクとの論理積を取ると、記録してある背景マスクから爆破パターンを削ることができます。
そうすることで、当たり判定用の配列に記録されているのは、爆破で削られ破壊された地形のマスクデータになります。

Re: 裏画面での当たり判定

Posted: 2012年2月05日(日) 12:31
by RYOkun
ご返答ありがとうございます。

お二人様に大変感謝しております。。

一度、簡単なサンプルをつくって色々試してみようと思います。

しかし、私の考えている手法ってのは、ごく当たり前の処理なのか、もしくはすごく古典的なのかわか

りませんが、Googleで調べてもあまり検索結果がないんですね。。

今回は、アルゴリズムでしたが、次回は、コードで質問するかもなので、また機会があれば

よろしくご指導お願いします!!