Actionscript 3 AS3 MovieClip getRealBounds

Actionscript 3 AS3 MovieClip getRealBounds,actionscript-3,movieclip,bounds,Actionscript 3,Movieclip,Bounds,正如您在as3中所知道的,我们有一个getBounds()方法,它返回我们想要的DisplayObject容器中movieclip的精确尺寸和坐标。 事实上,这些数据是根据调用getBounds()时MC中处于其所在帧状态的图形计算的。 我想要的是真实边界矩形,即整个动画movieclip将在其容器中容纳的较大矩形。 我想到了两种方法: 1-我不知道的flash内置方法 2-通过每一帧始终获得边界并最终返回最大的(但是如果这是一个长动画呢?我应该等到它完全播放后才能得到我想要的吗? 我希望我已经

正如您在as3中所知道的,我们有一个getBounds()方法,它返回我们想要的DisplayObject容器中movieclip的精确尺寸和坐标。 事实上,这些数据是根据调用getBounds()时MC中处于其所在帧状态的图形计算的。

我想要的是真实边界矩形,即整个动画movieclip将在其容器中容纳的较大矩形。
我想到了两种方法:
1-我不知道的flash内置方法
2-通过每一帧始终获得边界并最终返回最大的(但是如果这是一个长动画呢?我应该等到它完全播放后才能得到我想要的吗?


我希望我已经说清楚了。如果你需要例子,让我知道

我在将动画转换为位图数据帧时遇到了这个问题,因为我希望所有生成的帧大小一致,并且与最大的帧尺寸匹配

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


因此#2是您的最佳选择,因为没有内置的flash方法可以提供您所需的内容。

您可以迭代每个帧,而无需等待动画播放:

假设您的剪辑名为
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速度而不是帧速率通过每一帧?如果动画是10秒,我就不能等那么长时间才能得到信息。@AndreaSilvestri当然。你可以用定时器,它可以前进得更快。我隐约记得这一点,但即使这完全有道理。。。我相信有一个警告。我不记得是否有解决方法,但基本上我认为问题在于gotoAndPlay()只更新enterframe上的剪辑。所以如果你把它放在计时器上。。。除了输入一个新的帧外,它仍然不准确。如果你明白我的意思。:)让我知道这对你是否有效,这只是我的回忆。我只是用setInterval(每1ms)和nextFrame()进行了一次快速测试,它似乎得到了正确的边界,不过对于10秒的动画,计算大约需要3秒或更长的时间=\n你也可以在循环中使用
getBounds()
,但是它更贵,如果宽度/高度足够的话,我不会使用它。尽管我喜欢这个主意,但我认为这行不通。如果一个框架的边界是矩形(100300200900),而后面的边界是矩形(0,01000600),会怎么样?使用你的方法,我会选择第二个矩形,因为它是最大的,但作为边界矩形将不起作用,因为它不包括前一个矩形。对于每个getBounds,我都会寻找最小值x、最小值y、最大值x和最大值y。这将为绘制一个包含所有动画的矩形提供所有信息。希望我已经讲清楚了。这只是您将使用的语法的一个示例。你可以根据自己的情况调整数学。您可以轻松地将MaxH/MaxW更改为矩形对象。您没有指定此数据的用途,因此我提供了最有效的示例代码。我更新了答案,改为使用矩形和使用
getBounds()的exmaple
这就是我想要的:下面是一个快速有效的示例:循环我的问题,看看如果大多数问题没有答案或没有有用的信息,这不是我的错=\
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();
}