0

やっているゲームに問題があります。私は基本的にマップ内にあるオブジェクトを持っており、それらが壁に衝突するかどうかをそれぞれチェックする必要があります (そして何かをします)。AS2 で作業していたので、同じ方法を考えました: 壁だけで絵を描いたので、長方形だけでその間の他のすべてが透明です (存在しないので、たとえば床)。AS2 では、画像を画面に表示します。これを壁と呼びましょう。次に、すべてのオブジェクトで壁に対して hitTest を実行しました。たとえば、オブジェクトは実際には画像上にありました。透明な部分はその一部であったためですが、機能は可視部分のみでテストされていたため、壁もそうでした。それでうまくいきました。

AS3 にはHitTestbut がありませhitTestObjectwall.hitTestObject(object)。問題は、この関数はまるで透明を見ていないかのようであり、壁に触れていないオブジェクトが透明に衝突することです!

実際に問題を解決するを見つけましたPixelPerfectCollisionDetectionが、それは巨大で重いので、私の場合、各フレームでテストするオブジェクトが非常に多い (少なくとも 60) ため、ゲームの速度が大幅に低下します!

私が必要としているhitTestObjectのは、画像の透明な部分を処理する (あまり精度は必要ありません!) ような関数です。

どのようにできるのか?

4

2 に答える 2

2

コメントで述べたように、物理/ゲーム ライブラリにはこのコードが組み込まれており、すぐに使用できるはずです。

しかし、自分で構築したい場合、または独自の最適化を導入したい場合は、最初のステップ (非常に安価です) は完全に組み込まれたDisplayObject.getBoundsandの機能を使用して境界衝突をチェックしRectangle.intersectsます (一貫した座標空間で行う必要がありますが、すなわちステージ):

if (obj1.getBounds(stage).intersects(obj2.getBounds(stage)) {
  // Cheap bounds intersection is true, now do pixel-perfect detection...
}

次に、境界チェックが true の場合、ピクセル パーフェクトな衝突検出を実行します。

BitmapData.hitTestが最善の策のようです。Mike Chambers によるブログ投稿を参照してください。

この方法の前に、きちんとしたテクニックに興味がある場合は、Grant Skinner が彼のブログで概説している方法がありました。これは、組み込みのビットマップ ルーチン (かなり高速) を使用する非常に巧妙なアルゴリズムであり、重なっている領域と同じ大きさの BitmapData を作成し (または縮小しても)、2 つのオブジェクトをビットマップデータの特定のチャネルに描画し、BitmapData.getColorBoundsRect()ピクセルが接触しているかどうかを判断します。BitmapData.hitTest の方が速いと思いますが、比較するのは楽しいでしょう。

于 2013-05-30T23:09:02.330 に答える