0

ムービークリップのビットマップを描画してから、ヒットテスト関数に入力して衝突をテストします。ただし、スケーリングおよび/または回転されたムービークリップのビットマップを考慮して描画するために、以下のコードに追加する方法がよくわかりません。以下のコードは、明らかに変換されていないムービークリップに対してのみ機能します。私はすでに試したコメントコードに含めましたが、成功しませんでした。

描画されたビットマップをステージに追加すると、問題のムービークリップが変換されているかどうかに関係なく、描画されたビットマップは「切り取られ」、正しく描画されません。その一部だけが描画されているように見えます。ただし、これは変換されていないムービークリップの衝突テストには特に影響しませんが、変換されたムービークリップには悪影響を及ぼします。

描画したいムービークリップはすべて、グラフィックス プロパティを使用して作成されています。

           //for example: 
            var mymc:MovieClip = new MovieClip();
            var g:Graphics = mymc.graphics;                        
            g.moveTo(0,0);
            g.lineTo(17.5,0);
            g.lineTo(8.75,17.5);
            g.lineTo(-8.75,17.5);
            g.lineTo(0,0);

メインコード:

for each(var mc:MovieClip in impassable) {  

        //var bMatrix:Matrix = new Matrix();

        //bMatrix.scale(mc.scaleX, mc.scaleY);

        //bMatrix.rotate(mc.rotation * (Math.PI/180));

        var bData:BitmapData = new BitmapData(mc.width, mc.height, true, 0);

        //bData.draw(mc, bMatrix);

        bData.draw(mc);

        var bitmap:Bitmap = new Bitmap(bData);

        bitmap.x = mc.x;
        bitmap.y = mc.y;


        var HitTest:Number = newCollision(bitmap, centerX, centerY, 13.7);

何かご意見は?ありがとう

4

2 に答える 2

1

この関数は、変換行列を考慮して のBitmapDataクローンを作成DisplayObjectしますが、ビットマップ フィルタは考慮しません。(この回答に基づいています。)

function createBitmapClone(target:DisplayObject):BitmapData {
    var targetTransform:Matrix = target.transform.concatenatedMatrix;
    var targetGlobalBounds:Rectangle = target.getBounds(target.stage);
    var targetGlobalPos:Point = target.localToGlobal(new Point());

    // Calculate difference between target origin and top left.
    var targetOriginOffset:Point = new Point(targetGlobalPos.x - targetGlobalBounds.left, targetGlobalPos.y - targetGlobalBounds.top);

    // Move transform matrix so that top left of target will be at (0, 0).
    targetTransform.tx = targetOriginOffset.x;
    targetTransform.ty = targetOriginOffset.y;

    var cloneData:BitmapData = new BitmapData(targetGlobalBounds.width, targetGlobalBounds.height, true, 0x00000000);
    cloneData.draw(target, targetTransform);

    return cloneData;
}
于 2013-04-13T01:55:40.090 に答える
0

Matrix で連続する変換を呼び出す場合、順序付けは非常に重要であり、実際に混乱を招く可能性があります。

幸いなことに、平行移動、回転、スケーリングを一度に指定して、これらの問題を回避できるヘルパー メソッドcreateBoxがあります。

あなたの場合、次のようなものです:

var matrix:Matrix = new Matrix();
matrix.createBox(mc.scaleX, mc.scaleY, mc.rotation*Math.PI/180, 0, 0);

(2 つのゼロは x と y の変換用です)

于 2013-04-11T21:38:30.820 に答える