2010-04-03 58 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中检查它。

相关问题