AS3 MovieClip getRealBounds

时间:2012-12-06 15:36:22

标签: actionscript-3 movieclip bounds

正如你在as3中所知,我们有一个getBounds()方法,它返回我们想要的DisplayObject容器中movieclip的确切维度和坐标。 事实是,这些数据是根据它们在调整getBounds()时的帧中MC状态的图形计算的。

我想要的是REAL边界矩形,即WHOLE动画movieclip将在其容器中采用的较大矩形。
我想到了两种方式:
1 - 我不知道的闪存内置方法 2 - 经历每一帧总是得到界限并最终返回最大的(但如果它是一个长动画呢?我应该等待它完全发挥才能得到我想要的东西吗?)

< / p>

我希望我已经清楚了。如果您需要示例,请告诉我们!

2 个答案:

答案 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是你最好的选择,因为没有闪存内置方法可以提供你想要的东西。