Movieclip - > BitmapData和原点

时间:2012-06-08 17:04:48

标签: actionscript-3 flex

我正在尝试将一个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绘图代码才能实现此目的?

2 个答案:

答案 0 :(得分:1)

好的我明白了!

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

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));

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

答案 1 :(得分: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;

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