我正在尝试绘制一个BitmapData的MovieClip,这样它看起来就像我画的addChild(电影剪辑)一样。
我似乎想不出我需要使用什么魔术公式来保持动画在它的原点附近。
下面是相关的代码:
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绘图代码进行哪些更改?
发布于 2012-06-09 03:34:34
好了,我想通了!
问题的原因是我没有正确计算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-09 02:57:30
好吧,我不能让你的项目运行,因为你没有提供一个主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;记住这里未测试的代码。:(
https://stackoverflow.com/questions/10953105
复制相似问题