スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

当たり判定

クリスマスゲー作った時の当たり判定などのお話です。
長いです。画像多め。

ScreenShot_2012_1224_22_59_46.png

ちなみにこのゲーム、マップが自動生成だったりします。
生成時に、建物の位置と高さをDBに入力させます。

プレゼントは20ヶの上限をつけて、DBでXY座標とXY方向のスピード、回転角度を管理します。
赤い丸から発射して、サンタ自身の速度+ランダムで速度と座標を入力させます。

ステージが始まったら雪のエフェクトを並列で起動してます。
こいつが一番時間かかりました。
まあでも綺麗に出来たのでよしとします。
スクロールにロックさせながら移動するのが難しかったです。
ウディタを使いこなしてる人なら、もうちょっとサクッと作れるんでしょうけど。



当たり判定は毎フレームやっているので、できるだけ処理を軽くしなくてはなりません。
判定を段階に分けて、余計な処理はしないようにします。

1.Y座標
  赤線が、建物の最大高さと最小高さ。この範囲にないときは判定しないようにします。
  以下同様に、該当しない場合はイベント処理を中断します。
2.建物有無
  建物がないときは、それ以外のDBを参照しないようにします。
3.再びY座標
  プレゼント現在位置にある建物の高さを取得。上端を超えたら当たりとします。
4.建物情報
  プレゼントが欲しいかどうか、その残り回数で点数を決めます。
5.再びY座標(1.と同じ行ですが)
  赤線より下回ったらアウト。発射した位置がここより下でもアウト。


こんな感じです。
赤線の間にプレゼントが集中したりすると、我がPCでは処理落ちしました。
みなさんはどうだったんでしょうか。


ソニックサンタはピクチャの当たり判定ですが、せっかくウディタを使ってるので
マップイベントの当たり判定についても考えてみました。
標準の座標なら、攻撃した場所にイベントIDが存在するかどうかだけで出来るので簡単ですね。
ここでは精密座標で考えてみます。

hantei1.png

ウルファールさんが、ニワトリに突き攻撃をします。
赤い部分が攻撃の範囲です。
この場所のイベントIDを取得すると……


【-1】が返りました。
存在しないようです。
当たっているように見えるんですが。

精密座標は、左上の座標を返します。(講座ページ「座標系」参照)
ニワトリの背中部分です。
なので、赤い部分と重なっていないので判定はNGでした。

hantei2.png

ならば、それぞれの部分について左上に範囲を拡張してやりましょう。
赤の濃い部分が本来の攻撃範囲、薄い部分が拡張した範囲です。
こうしてやれば、半歩移動で精密座標のどの位置にいても当たりかどうか判定できます。
ただ、判定回数が多いですね。
濃い赤・左・上・左上を判定するのを3回するので、4×3で12回。
攻撃範囲が広くなってくると、回数も増えてしまいます。

ならば、【最初から薄い赤も判定位置に含める】と、少し軽減されます。
この技はこの向きの時にここを判定、みたいな数値をDBに入れておけば便利ですね。
これなら、図の範囲なら10回なので、約二割減です。

hantei2-2.png

こういう広い範囲の攻撃だと顕著ですね。
64×4=256のところ、79回で済むので約七割減です。

hantei3.png




次の方法。
上の図のように、攻撃した瞬間のイベントの座標を出します。(画像の数値はあくまで例で、適当です)
精密座標でどこからどこまでに存在しているかを取得。
DBとかに入れます。
サンタの例のように、段階を踏むといいですね。

左上にいるハカセは画面外なので、判断対象外。ニワトリと村人、合計2キャラについて判定します。

一つ目の点、Y座標が範囲内のイベントなし→処理中断
二つ目の点、Y座標が範囲内のイベントあり→X座標範囲外→処理中断
三つ目の点、X座標が範囲内のイベントあり→Y座標範囲内→当たり!→ダメージ処理
こういうような処理です。


Y座標を先に判断しているのは、Yのほうが少ないからです。幅15の高さ11でしたっけ?
今回の処理では関係ないですが、なんとなく癖でこういう順番にしてしまいます。
総当りの数は少ないほうがいいですからね。

イベントの数が少ない時は、こっちの方が早いかもしれません。


hantei4.png



次の方法。
直接攻撃とかだと、上の図のような範囲が多いような気がします。
こういう形にのみ適用できる方法。


hantei4-2.png


主人公に重なる、透明なイベントを用意しておきます。
普段は何もせず、キー入力か何かで主人公と重なるようにしておきます。
攻撃する時に、

・主人公を透明に、イベントを主人公の画像にする
・スクロールをロックする
・主人公を最速で一歩移動、プレイヤー接触で当たり判定、すぐに場所移動で元に戻る
・イベントを透明に戻す
・スクロールロック解除

とすれば、マップイベントで当たり判定ができます。

イベントが透明でなく、最初から主人公が透明でもいいですね。
その方が、ピクチャの処理が無いぶん早そうです。


欠点としては、1(2?)フレームかかること。
攻撃の瞬間に主人公が一瞬立ち止まります。
硬直時間は普通あるものなので、問題ない範囲だとは思いますが。



※ただし、すべての方法は未検証つまり机上の空論なので、保証はいたしかねます。



たまには違ったことをすると、ウディタの使い方を考えるきっかけになっていいですね。
きっかけをくれた方に感謝。
関連記事

Comment

Post a comment

非公開コメント

お知らせ

記事移行完了

記事をFC2からcatgames.16mb.comへ移行完了しました。

このサイトは更新されません。

カウンター

2012/09~

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。