我正在尝试将一个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绘图代码才能实现此目的?
答案 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;
请在此处记住未经测试的代码。 :(