2

as3 でよく知られているように、必要な DisplayObject コンテナ内のムービークリップの正確な寸法と座標を返す getBounds() メソッドがあります。実際には、これらのデータは、getBounds() が呼び出されているフレームの MC での状態のグラフィックスに基づいて計算されます。

私が欲しいのは、REAL 境界の四角形です。これは、アニメーション化されたムービークリップ全体がコンテナに取り込まれるより大きな四角形です。
私は 2 つの方法を考えました:
1 - 私が知らないフラッシュ組み込みメソッド
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()上記の例で使用して、返された四角形をlifetimeBounds 四角形と比較することもできます。

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 に答える