2013-07-04 96 views
1

在調用使用外部位圖文件作爲填充的函數addNodeFilled()之前,我必須使用Loader類在flash播放器中加載位圖文件,並等待加載器完成加載並觸發Event.COMPLETE並執行相應的事件處理函數onComplete()。爲了確保這一點,我有一個while循環來等待addNodeFilled()中的加載完成,但是在運行程序時,程序尤其是循環會無限進行,這意味着在閃存中事件處理程序與主序列同步執行,並且不能執行,直到addNodeFilled()結束。通常在addNodeFilled()代碼放在裏面onComplete事件處理程序,但我無法做到這一點,需要調用addNodeFilled()每當我想,但檢查負載完成,我該怎麼辦呢?AS3事件架構問題

var stitch:BitmapData = new BitmapData(16, 16); 
var loaderStatus:String = "busy";   

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
loader.load(new URLRequest("file:///E:/Projects/FlashDevelop/Terracotta/assets/Stripe.jpg")); 

addNodeFilled(100, 100); 



//function definitions=============================================== 


function onComplete(event:Event):void 
{ 
    stitch = event.target.content.bitmapData; 
    loaderStatus = "loaded"; 

} //onComplete 

function addNodeFilled(posx:Number, posy:Number):void 
{ 
    while(loaderStatus != "loaded") 
    { 
    trace("waiting for loader"); 
    }   

    var grid:Rectangle = new Rectangle(5, 5, 5, 5); 
    var nodeDecal:Sprite = new Sprite(); 
    nodeDecal.graphics.beginBitmapFill(stitch, null, true, true); 
    nodeDecal.graphics.drawRoundRectComplex(posx, posy, 80, 16, 0, 0, 4, 4); 
    nodeDecal.scale9Grid = grid; 
    addChild(nodeDecal); 

} //addNodeFilled 
+0

你不能將addNodeFilled()調用移動到onComplete(event:Event)嗎? –

+0

正如我已經說過,將事件處理函數內部的addNodeFilled()放置在通常情況下是如何完成的,但我不能這樣做,因爲需要一次又一次地調用addNodeFilled(),並且當需要使用不同位置參數的新節點時相同的用戶提供了位圖圖像作爲填充。這種被迫將操作函數調用(這裏是addNodeFilled)放在事件處理函數中的情況是有限制的,因爲它只能用相同的參數調用一次,通常保證某事已完成,操作函數依賴於,需要保證一次。 – timmaktu

回答

1

AS3在單線程上執行。你永遠不會收到任何與該循環的事件通知。我用下面的代碼嘲笑了一個更好的模式。你將不得不根據你的需要來適應它。值得注意的是,你必須從addNodeFilled()和到它自己的方法了移動繪圖代碼,可以從addNodeFilled()onComplete()被稱爲,是必要的。

如果有多個抽獎的動作,你有一個隊列,資產被加載後得到執行,以取代drawPending變量。我沒有在這裏嘲笑它,因爲它會顯着增加代碼的複雜性。

var loader:Loader; 
var loadPending:Boolean = false; 
var isReady:Boolean = false; 
var drawPending:Boolean = false; 

function onComplete(event:Event):void 
{ 
    if (drawPending) 
    { 
     // Perform drawing operating 
    } 
} 

function triggerLoad():void 
{ 
    loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); 
    loader.load("http://example.com"); 

    loadPending = true; 
} 

function addNodeFilled(x:Number, y:Number):void 
{ 
    if (!isReady) 
    { 
     triggerLoad(); 
     drawPending = true; 

     return; 
    } 

    if (loadPending) 
    { 
     drawPending = true; 

     return; 
    } 

    // Use asset as needed 
} 
+0

+1:簡單而有效。在這種情況下,資產/繪圖操作可能需要在addNodeFilled()或onComplete()的末尾調用附加方法。 – Aralicia