正如你在as3中所知,我们有一个getBounds()方法,它返回我们想要的DisplayObject容器中movieclip的确切维度和坐标。
事实是,这些数据是根据它们在调整getBounds()时的帧中MC状态的图形计算的。
我想要的是REAL边界矩形,即WHOLE动画movieclip将在其容器中采用的较大矩形。
我想到了两种方式:
1 - 我不知道的闪存内置方法
2 - 经历每一帧总是得到界限并最终返回最大的(但如果它是一个长动画呢?我应该等待它完全发挥才能得到我想要的东西吗?)
< / p>
我希望我已经清楚了。如果您需要示例,请告诉我们!
答案 0 :(得分:4)
您可以遍历每个帧而无需等待动画播放:
假设您的剪辑名为bob
:
var lifetimeBounds:Rectangle = new Rectangle();
bob.gotoAndStop(1);
for(var i:int=1;i<=bob.totalFrames;i++){
lifetimeBounds.width = Math.max(lifetimeBounds.width, bob.width);
lifetimeBounds.height = Math.max(lifetimeBounds.height, bob.height);
lifetimeBounds.x = Math.min(lifetimeBounds.x, bob.x);
lifetimeBounds.y = Math.min(lifetimeBounds.y, bob.y);
bob.nextFrame();
}
bob.gotoAndStop(1); //reset bob back to the beginning
这会增加CPU负担(所以如果上述情况适用于您的情况,我建议不要使用它),但您也可以在上面的示例中使用getBounds()
并将返回的矩形与lifetimeBounds矩形进行比较:< / p>
var tempRect:Rectangle;
var lifetimeBounds:Rectangle = new Rectangle();
bob.gotoAndStop(1);
for(var i:int=1;i<=bob.totalFrames;i++){
tmpRect = bob.getBounds(this);
lifetimeBounds.width = Math.max(lifetimeBounds.width, tempRect.width);
lifetimeBounds.height = Math.max(lifetimeBounds.height, tempRect.height);
lifetimeBounds.x = Math.min(lifetimeBounds.x, tempRect.x);
lifetimeBounds.y = Math.min(lifetimeBounds.y, tempRect.y);
bob.nextFrame();
}
答案 1 :(得分:1)
将动画转换为bitmapData帧时遇到此问题,因为我希望所有生成的帧都是统一的大小并匹配最大的帧尺寸。
我基本上必须一次遍历动画1帧并将边界框与当前最大尺寸进行比较。我也认为这不是一个理想的解决方案,但它确实有效。
所以#2是你最好的选择,因为没有闪存内置方法可以提供你想要的东西。