Actionscript 3 基于变换后的movieclip绘制位图

Actionscript 3 基于变换后的movieclip绘制位图,actionscript-3,flash,bitmapdata,Actionscript 3,Flash,Bitmapdata,我正在绘制movieclips的位图,然后将其输入hittest函数以测试冲突。但是,我不太确定我将如何添加到下面的代码中,以考虑并绘制已缩放和/或旋转的movieclips的位图。下面的代码显然只适用于未转换的movieclips。我已经在注释中包含了我已经尝试过的代码,但是没有成功 将绘制的位图添加到后台时,无论相关的movieclip是否已转换,绘制的位图都是“被切断”且绘制不正确的-它似乎只绘制了其中的一部分。然而,这并不特别影响非转换电影唇的碰撞测试,但对转换电影唇有不利影响 我想要绘

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

将绘制的位图添加到后台时,无论相关的movieclip是否已转换,绘制的位图都是“被切断”且绘制不正确的-它似乎只绘制了其中的一部分。然而,这并不特别影响非转换电影唇的碰撞测试,但对转换电影唇有不利影响

我想要绘制的所有movieclips都是通过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);

有什么想法吗?谢谢

当你调用矩阵上的连续变换时,排序非常重要,而且会把事情搞得一团糟

幸运的是,有一个帮助器方法允许您一次性指定平移、旋转和缩放,并避免这些问题-

对于您的情况,类似以下内容:

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

(两个零用于x和y转换)

此函数将创建
显示对象的
位图数据
克隆,考虑其变换矩阵,但不考虑位图过滤器。(根据答案。)


是否可能有一个您不转换的父MC,然后使用draw()绘制其内容?@amy。嗯,我以前试过,但它似乎只是字面上删除儿童MC。我确信这可以通过矩阵实现,但我不确定如何实现。我的答案是一个代码片段,它创建了转换后的
DisplayObject
Bitmap
克隆。听起来它可以满足你的需要?(虽然很明显,你可以省去在舞台上定位
位图的额外步骤)。@DavidMear非常感谢这段深入细致的代码。这似乎正是制作转换后电影剪辑的精确副本并正确对齐所需的。但是,尽管克隆正确,位图似乎仍然无法与我的冲突功能配合使用。。不管怎样,如果我不能弄明白,那将是一个不同的问题。如果你把这个写进一个答案,我会接受这个作为我的答案。谢谢伟大的我已经发布了一个答案,但如果它仍然不起作用,我会感兴趣的,如果你添加了你的碰撞功能的问题。如果您在我上一个回答中尝试第二个版本的函数,它会重新缩放位图以取消阶段外缩放,因此这可能是导致问题的原因。根据您的评论进行更多测试后,我认为问题可能是由于
getBounds
返回的区域大于对象的实际像素大小。这在视觉上并不重要,但显然会破坏碰撞检查。我有一些部分修正,但如果我找到了一个可靠的解决方案,我会更新我的答案。我认为这个编辑可能会有所帮助。我已经调整了
targetOriginOffset
,以消除
getBounds
DisplayObject
的实际大小之间的差异,并将
BitmapData
更改为仅使用目标的大小。我假设这些值是相同的,但显然不是。谢谢,你所说的getBounds实际上让我意识到在我的碰撞函数中有一个愚蠢的错误,我使用了未转换的movieclip的边界,而不是克隆位图的边界来测试碰撞。。。碰巧我在你之前的答案中使用了函数的第二个版本,但是这两个答案都很好,但是这里提供的答案不是?我想我将使用你先前答案的第一个函数。谢谢啊,我错误地通过克隆父对象来测试这个,这会使
BitmapData
太大。只是把我自己弄糊涂了!我已经回滚了编辑,但很高兴原来的答案仍然有用。
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;
}