[英]Movieclip -> BitmapData and origin
我试图将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绘图代码才能实现此目的?
好吧,我想通了!
问题的原因是我没有正确计算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));
像这样,它适用于我测试过的每个动画。
好的,因为您没有提供主要的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;
在这里记住未经测试的代码。 :(
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.