1

このためのクラスを作成している人がいることを知っています (つまり、http://coreyoneil.com/portfolio/index.php?project=5 )。でも、必要な方法で必要なものをすべて作成できるように、自分でそれを行う方法を学びたいと思っています。

BitMap と BitMapData について読みました。MovieClip を BitMap に .draw できるはずなので、衝突を探してピクセルを循環させることができます。しかし、オフセットを扱うのは奇妙で紛らわしい..そして、MyBitMap.rectが常にx = 0およびy = 0であるように継ぎ目があります...そして、物事の元の位置を見つけるために継ぎ合わせることができません...

最初に hitTestObject を実行することを考えています。これが正の場合、ピクセルの衝突についてムービークリップの四角形の間の交差を調査します。しかし、別の問題もあります (ムービークリップの回転)...

...その方法について、ここでいくつかの啓蒙が必要です。お願いします、どんな助けでも大歓迎です..

4

4 に答える 4

1

フラッシュでのピクセル完全衝突検出の古典的なリファレンスは、このGrantSkinnerの記事です。AS2ですが、ロジックはAS3でも同じです(少しググると利用可能なポートがあります)。

私が正しく思い出せば、この特定の実装は、テストされた両方のオブジェクトが同じ親を持っている限り機能しましたが、それは修正できます。

BitmapDataxy値については、混乱を招く可能性があることを理解しています。しかし、それが機能する方法は私には理にかなっています。BitmapDataは、その名前が示すとおり、ピクセルデータです。これは表示オブジェクトではなく、表示リストに含めることはできません。したがって、0であるxy異なるかは、考えてみれば、実際には意味がありません。これに対処する最も簡単な方法は、おそらく(x,y)ソースオブジェクト(描画元の表示オブジェクト)のオフセットを保存し、それをグローバル座標空間に変換して、表示リスト内のオブジェクトの位置に関係なく、任意のオブジェクトを比較できるようにすることです(のようなものを使用しますvar globalPoint:Point = source.parent.localToGlobal(new Point(source.x,source.y))

于 2010-07-08T02:49:20.637 に答える
1

透過性のあるBitmapDataオブジェクトを使用している場合は、BitmapData.hitTest(firstPoint:Point、firstAlphaThreshold:uint、secondObject:Object、secondBitmapDataPoint:Point = null、secondAlphaThreshold:uint = 1):Booleanを使用できます。

グローバル座標からローカルBitmapData座標に変更する必要があります。これは、回転させると少し計算が必要になります。これは簡単に実現できます(ウィキの詳細については、アフィン変換を参照してください)。

var coordTransform:Matrix = new Matrix();

coordTransform.rotate(rotationRadians);
coordTransform.translate(x, y);

coordTransform.transformPoint(/* your point */);
于 2010-07-07T17:26:39.973 に答える
1

私は以前、Troy Gilbert のピクセル パーフェクト衝突検出クラス (Andre Michelle、Grant Skinner、および Boulevart から適応) を使用しました。これは非常にうまく機能します (回転、異なる親などを処理します)。

http://troygilbert.com/2007/06/pixel-perfect-collision-detection-in-actionscript3/
http://troygilbert.com/2009/08/pixel-perfect-collision-detection-revisited/

そこから、彼はこのプロジェクトにもリンクしています(私は使用していませんが、非常に印象的です):

http://www.coreyoneil.com/portfolio/index.php?project=5

于 2010-07-08T23:49:25.923 に答える
0

結局、なんとかそれを行うことができ、衝突検出、/衝突角度、およびその他のエクストラ用のクラスをすでに作成しました。

最も紛らわしいプロセスは、比較のためにビットマップを正しく配置することです。ムービークリップを BitmapData に draw() するときに、対応する Bitmap を addChild() すると、その一部が表示されないことがわかります。中央から右と下のみに描かれているように見え、上と左の部分は描かれていません。解決策は、描画メソッドの 2 番目の引数に、ビットマップを整列させてすべてを描画させる変換行列を与えることです。

これは、比較用のビットマップを作成するクラスの関数の例です。

    static public function createAlignedBitmap(mc: MovieClip, mc_rect: Rectangle): BitmapData{
                var mc_offset: Matrix;
                var mc_bmd: BitmapData;

                mc_offset = mc.transform.matrix;
                mc_offset.tx = mc.x - mc_rect.x;
                mc_offset.ty = mc.y - mc_rect.y;
                mc_bmd = new BitmapData(mc_rect.width, mc_rect.height, true, 0);
                mc_bmd.draw(mc, mc_offset);

                return mc_bmd;
}

それを使用するには、タイムラインにいる場合は次のようにします。

className.createAlignedBitmap(myMovieClip, myMovieClip.getBounds(this))

ムービー クリップが埋め込まれている四角形を返す getBounds の使用に注意してください。これにより、オフセット行列の計算が可能になります。

この方法は、ここに示されているものと非常によく似ていますhttp://www.mikechambers.com/blog/2009/06/24/using-bitmapdata-hittest-for-collision-detection/

ところで、これがあなたにとって興味深い問題である場合は、私の他の質問を確認してください。

于 2010-07-15T22:07:04.827 に答える