0

このコードを実行する

        var sp:Sprite = new Sprite();
        sp.graphics.beginFill(0xff);
        sp.graphics.drawRect(0,0,400,400);
        sp.graphics.endFill();
        sp.scrollRect = new Rectangle(0,0,350,350);
        addChild(sp);

        var count:int = 0;
        var f:Function = function(...args):void{
            trace(count++,sp.width,sp.height);
            if(count>5){
                removeEventListener(Event.ENTER_FRAME,f);
            }
        }
        addEventListener(Event.ENTER_FRAME,f);

得る

0 400 400
1 350 350
2 350 350
3 350 350
4 350 350
5 350 350

とにかく、最初のフレームでscrollRectを機能させることができますか?

4

1 に答える 1

3

確認したところ、おそらく Flash Player の内部レンダリングが原因です (実際のサイズを取得するには、現在のサイズと後のサイズの 2 つのフレームが必要です)。視覚的には四角形のサイズは変わらないため、2 フレーム後に更新されるのはオブジェクトの境界の値のみです (これは、1 FPS などの非常に低いフレームレートを設定することで簡単に証明できます)。

回避策の 1 つは、ステージを 1x1 の BitmapData に描画して「ハード」レンダリング パスを強制することです。これにより、表示リスト全体が効果的に更新され、draw() 呼び出しの直後にこれらの値が正しくなるはずです。したがって、コードは次のようになります。

var sp:Sprite = new Sprite();
sp.graphics.beginFill(0xff);
sp.graphics.drawRect(0,0,400,400);
sp.graphics.endFill();
sp.scrollRect = new Rectangle(0,0,350,350);
addChild(sp);

var count:int = 0;
function f(event:Event = null):void{
    new BitmapData(1,1).draw(stage);
    trace(count++,sp.width,sp.height);
    if(count>5){
        removeEventListener(Event.ENTER_FRAME,f);
    }
}
addEventListener(Event.ENTER_FRAME,f);
f();

(関数の宣言方法を変更したことに注意してください。これは、ほとんどの(すべてではないにしても)Flash 開発者の間で好まれる方法です。)

オブジェクトをステージに追加した後、ドローコールを 1 回だけ実行できますが、オブジェクトが変更された場合の安全性はわかりません。

于 2012-10-18T08:28:45.407 に答える