0

我正在绘制影片剪辑的位图,然后将其输入我的 hittest 函数以测试碰撞。但是,我不太确定如何添加到下面的代码中以考虑并为已缩放和/或旋转的电影剪辑绘制位图。下面的代码显然只适用于未转换的影片剪辑。我已经包含在我已经尝试过但没有成功的评论代码中。

将绘制的位图添加到舞台时,无论相关的影片剪辑是否被转换,绘制的位图都会被“切断”并错误地绘制 - 似乎只绘制了它的一部分。但是,这不会特别影响未转换的动画剪辑的碰撞测试,但会对已转换的动画剪辑产生不利影响。

我想要绘制的所有动画剪辑都是通过 graphics 属性创建的。

           //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

此函数将创建 a 的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);

(两个零用于 x 和 y 平移)

于 2013-04-11T21:38:30.820 回答