calendar

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< October 2017 >>

categories

archives

hitTestPointを使って背景との判定を作ってみる

0
    このあいだの超むりげーで集まったとき、babarageoのbabaraさんが「マリオって自機と障害物の判定とか面倒くさそう!なんかいい方法ないかい?」と仰られてましたので、自分が思いついた手法として、hitTestPointを使った作り方を紹介してみたいと思います。


    デモはこちら
    プログラム一式はこちら

    このデモで大体プログラム100行くらい。「}」だけの行とかも沢山あるので、頑張れば50行くらいでできそうな位のコード量です。基本的な動作の判定をほぼ全てhitTestPoint関数を使って行っています。hitTestPointは、あるDisplayObject(今回は背景)と、一点(今回は自機の進行方向の位置)が重なっているかどうかを判別してくれる関数です。DisplayObject同士(例えばMovieClipとMovieClip)が重なっているか判定するhitTestObjectという関数よりも、動作がかなり軽いらしいという事に最近気づいたので、自分もhitTestPointは最近のゲームには積極的に使っています。「ファイナルぴーちゃんをゲットせよ」でも、hitTestPointをあらゆる当たり判定の場面において多用しましたが、それによるパフォーマンス上の影響は少なかったと思います。

    今回のデモでは、自機が走ったときは進行方向10pxくらい先の座標位置と背景をhitTestPointして障害物とぶつかるか判定し、ジャンプしたときはジャンプした頭の上(y座標)及び足元の座標と背景をhitTestPointして空中か着地かを判定しています。

    あと、ちょっとした注意点としては、移動速度とフレームレートによっては、障害物にめり込んで停止する場合がありえますので停止したときに、若干障害物にめり込んでいたら位置を微調整して直すようなロジックを入れてあげるといいと思います。
    (サンプルプログラムでは、着地時に位置を微調整するロジックを入れています。左右の移動には逆に微調整を入れていないので、若干めり込んで止まる場合があります)

    あと、サンプルの中にある赤い板のように、厚さが薄いものはタイミングによって当たり判定がスカッてしまう場合があります。(サンプルでは、自機の当たり判定は10px先で行っているが、赤い板は厚さが3pxしかありません)この場合は、赤い板のところに、高さ15pxくらいのアルファ0%の透明な図形を配置してあげます。そうすれば、見た目は薄い3pxの板ですが、当たり判定はアルファ0%の部分も考慮して判定してくれるので、スカることが無くなります。


    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック