2012-10-18 39 views
0

運行此代碼爲什麼scrollRect隻影響下一幀?

 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的工作?

回答

3

我剛剛檢查過,它可能是因爲Flash Player中的一些內部渲染東西(它實際上需要兩幀才能獲得真實尺寸,當前尺寸和後一個尺寸)。這個矩形在視覺上並沒有改變大小,所以它只是對象邊界的值,在兩幀後更新(你可以通過設置非常低的幀率,比如1 FPS來輕鬆證明這一點)。

一種解決方法是通過將舞臺繪製到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開發人員。)

你可以在將對象添加到舞臺後只進行一次繪製調用,但是我不知道如果對象更改會有多安全。

+0

哇,我從來沒有想過用位圖數據來強制它刷新的方式,你統治! – Max