0

我正在尝试将 MovieClip 绘制到 BitmapData 上,这样它看起来就像我完成了 addChild(movieclip) 一样。

我似乎无法弄清楚我需要使用什么魔法公式来将动画保持在其原点附近。

这是相关的代码:

private function update(e:Event):void
{
    var bounds:Rectangle = movieClip.getBounds(movieClip);
    bitmapData = new BitmapData(maxMCwidth, maxMCheight, true, 0x0);
    bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, maxMCwidth - (bounds.x + bounds.width), maxMCheight - (bounds.y + bounds.height)));
    bitmap.bitmapData = bitmapData;
}

完整代码在这里: http: //pastebin.com/KyU5FPeJ

结果如下:

http://www.swfcabin.com/open/1339173476

顶部动画是使用 addChild(mc) 完成的。底部动画是使用 bitmapData.draw 完成的。注意右边的剑在底部版本中没有水平移动。几乎就好像整个动画都在右对齐一样。

这也是我的 flashdevelop 项目的完整代码链接,以防有人想玩它:https ://www.dropbox.com/s/gvt4scknqdian2a/bitmapdatadrawing.zip

我只希望两个版本看起来一样。我需要对我的 bitmapData 绘图代码进行哪些更改才能实现这一点?

4

2 回答 2

1

好的,我想通了!

问题的原因是我没有正确计算 maxMCwidth 或 maxMCheight。我正在通过电影剪辑寻找最宽/最高的单帧。但是这并没有考虑到跨帧边界的位置会发生变化。为了获得整个动画的实际最大宽度/高度,我使用了以下代码:

maxBounds = new Rectangle();
for (var i:uint = 0; i < movieClip.totalFrames; i++)
{
    var tempBounds:Rectangle = movieClip.getBounds(movieClip);
    maxBounds = maxBounds.union(tempBounds); 
    movieClip.nextFrame();
}

然后这使我能够修复翻译矩阵:

bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, -maxBounds.x, -maxBounds.y));

就像这样,它适用于我测试过的每一个动画。

于 2012-06-08T19:34:34.393 回答
0

好的,我无法让您的项目运行,因为您没有提供主 mxml。
但是,我想我找到了你的问题。
我认为 getBounds 不会返回您认为的值。
我无法查看骨架 swc,但我有一种感觉,其中有一个物体离开屏幕的顶部或底部,并且您编码它的方式会导致它缩小以使其适合。
getBounds 可能会将其添加到高度。

bitmapData = new BitmapData(movieClip.width, movieClip.height, true, 0x0);
bitmapData.draw(movieClip, new Matrix(1, 0, 0, 1, movieClip.width/2, movieClip.height/2 )); 
bitmap = new Bitmap(bitmapData);
bitmap.x = 70;
bitmap.y = 200;

在此处记住未经测试的代码。:(

于 2012-06-08T18:57:30.073 回答