Actionscript 3: заставить программу ждать, пока не будет вызван обработчик события - PullRequest
2 голосов
/ 04 апреля 2010

У меня есть класс AS 3.0, который загружает файл JSON при использовании URLRequest.

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 вызывается до того, как она закончит загрузку, программа завершится ошибкой.

Как я могу заставить класс ждать приема вызовов функций до тех пор, пока файл не будет загружен?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2010

Хорошо, я понял, что мне нужно делать. Проблема была с кодом на моей основной временной шкале:

trace(bg.getMapWidth());

Я забыл, что код выполняется только один раз без прослушивателя событий на основной временной шкале, как это

stage.addEventListener(Event.ENTER_FRAME, n);

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

Теперь ширина возвращается один раз за кадр, и все работает правильно. Спасибо за вашу помощь;)

0 голосов
/ 04 апреля 2010
 private function mapHandler(e:Event):void {
              if (mapLoaded) {

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

             } else {

           getMapWidth()

        }

}

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


        }

Это может решить вашу проблему, зачем проверять ее в getMapWidth, когда в этом нет необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...