2010-04-03 37 views
2

我有一個AS 3.0類,使用URLRequest加載JSON文件。Actionscript 3:強制程序等待,直到事件處理程序被調用

package { 

    import flash.display.MovieClip; 
    import flash.display.Loader; 
    import flash.net.URLRequest; 
    import flash.net.URLLoader; 
    import flash.events.Event; 

    public class Tiles extends MovieClip { 

     private var mapWidth:int,mapHeight:int; 
     private var mapFile:String; 

     private var mapLoaded:Boolean=false; 

     public function Tiles(m:String) { 

      init(m); 

     } 

     private function init(m:String):void { 

      // Initiates the map arrays for later use. 
      mapFile=m; 

      // Load the map file in. 
      var loader:URLLoader = new URLLoader(); 
      loader.addEventListener(Event.COMPLETE, mapHandler); 
      loader.load(new URLRequest("maps/" + mapFile)); 


     } 

     private function mapHandler(e:Event):void { 

      mapLoaded=true; 
      mapWidth=3000; 

     } 

     public function getMapWidth():int { 

      if (mapLoaded) { 

       return (mapWidth); 

      } else { 

       return(-1); 
      } 

     } 

    } 

} 

當文件被加載完成,則mapHandler事件進行更改類的屬性,而這又是使用getMapWidth函數訪問。但是,如果getMapwidth函數在完成加載之前被調用,程序將失敗。

如何才能讓該類等待接受函數調用,直到文件加載完成爲止?

+0

如果在完成加載文件之前調用getMapWidth()函數,爲什麼程序會失敗? 是不是照顧,通過遞歸getMapWidth()? – 2010-04-03 21:28:48

+0

哎呀,忘了編輯那條線。調用getMapWidth()遞歸地給出了堆棧溢出錯誤,所以這是不可能的。 – 2010-04-03 21:35:02

回答

0

好的,所以我想出了我需要做的事情。問題出在我主要時間線上的代碼上:

trace(bg.getMapWidth());

我忘了代碼只執行一次,而不在主時間軸上的事件偵聽器,這樣

stage.addEventListener(Event.ENTER_FRAME, n); 

function n(e:Event):void 
{ 
    trace(bg.getMapWidth()); 
} 

現在寬度每幀返回一次,一切正常。感謝您的幫助;)

0
private function mapHandler(e:Event):void { 
       if (mapLoaded) { 

       mapLoaded=true; 
       mapWidth=3000; 
       return (mapWidth); 

      } else { 

      getMapWidth() 

     } 

} 

     public function getMapWidth():int 
       return(-1); 


     } 

這可能會解決您的問題,爲什麼在不需要它的時候在getMapWidth中檢查它。

相關問題