2

众所周知,在 as3 中,我们有一个 getBounds() 方法,它返回我们想要的 DisplayObject 容器中影片剪辑的确切尺寸和坐标。事实上,这些数据是根据调用 getBounds() 时帧中 MC 中的图形状态计算得出的。

我想要的是真正的边界矩形,即整个动画影片剪辑将在其容器中的较大矩形。
我想到了两种方法:
1 - 我不知道的 Flash 内置方法
2 - 遍历每一帧总是得到边界并最终返回最大的(但是如果它是一个长动画呢?我应该等待它在我得到我想要的东西之前完全玩?)

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

4

2 回答 2

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()在上面的示例中使用并将返回的矩形与 lifeBounds 矩形进行比较:

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();
}
于 2012-12-06T18:23:17.370 回答
1

我在将动画转换为 bitmapData 帧时遇到了这个问题,因为我希望所有生成的帧都具有统一的大小并匹配最大的帧尺寸。

我基本上必须一次循环播放 1 帧动画,并将边界框与当前最大尺寸进行比较。我也认为这不是一个理想的解决方案,但它确实有效。

所以#2 是你最好的选择,因为没有内置的闪存方法可以提供你所寻求的。

于 2012-12-06T15:48:24.690 回答