Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Дождаться завершения события другого класса (http://www.flasher.ru/forum/showthread.php?t=138335)

Nitr0geN 05.04.2010 11:48

Дождаться завершения события другого класса
 
Есть класс, в котором происходит подгрузка данных из XML и распарсевание данных по переменным класса. Как дождаться распарсивания этих переменных из главного класса программы? Чтобы присвоить переменной главного класса значение переменной класса, в котором прроисходят действия загрузки.

AlexDesinger 05.04.2010 12:07

используйте кастомное событие с помощью dispathEvent, для отсылки наверх нужного события, при получении которого, будут происходить дальнейшие действия.

Nitr0geN 05.04.2010 12:49

Спасибо! пробую так, но не получается.

Главный класс:

Код AS3:

package
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
 
        public class Burgame extends Sprite
        {
                private var player:Player = new Player();
                public function Burgame()
                {
                        player.addEventListener(Player.PLAYERLOADED,onPlayerLoaded);
                        player.Load();
                }
 
                private function onPlayerLoaded(event:Event):void
                {
                        trace (player.player_name);
                }
 
        }
 
}

Класс Player
Код AS3:

package
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.net.URLLoader;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLRequest;
 
        public class Player extends EventDispatcher
        {
                private var playerName:String;
                public static var PLAYERLOADED:String = "playerLoaded";
 
                public function Player()
                {
                        // Загрузка данных об игроке
                        var player:URLLoader = new URLLoader();
                        player.dataFormat = URLLoaderDataFormat.TEXT;
                        player.addEventListener(Event.COMPLETE, PlayerLoaded);
                        player.load(new URLRequest("http://localhost:8888/burgame/game.php?command=getPlayerInf"));
                }
 
                private function PlayerLoaded (event:Event):void
                {
                        try {
                                var player_xml:XML = new XML(event.target.data);
                                ParsePlayerData(player_xml);
                        }
                        catch (e:TypeError) {
                                trace("Не получилось преобразовать данные об игроке в формат XML");
                                trace(e.message);
                        }
                }
 
                private function ParsePlayerData(PlayerData:XML):void
                {
                        var player_name:String = PlayerData.record.player_name.text();
                        playerName = player_name;
                }
 
                public function Load():void
                {
                        dispatchEvent(new Event(Player.PLAYERLOADED));
                }
 
                public function get player_name():String
                {
                        return playerName;
                }
 
 
        }
}

В трейсе - null. Что я делаю не так? Спасибо!

oleg_tomenko 05.04.2010 12:51

Пардон, вы уже поняли.
У вас же playerName переменная называется, player_name локальная.

Nitr0geN 05.04.2010 13:05

Не понял я Вашего комментария :). player_name - есть локальная переменная в функции ParsePlayerData. Эта переменная дальше функции не видна. А есть метод, возвращающий имя игрока: public function get player_name():String.

udaaff 05.04.2010 13:14

Nitr0geN, вам же уже в прошлой теме объяснили, по-моему. Событие загрузки не происходит моментально, его нужно дожидаться. На то у вас и есть обработчик PlayerLoaded (название которого принято писать с маленькой буквы). И событие об окончании загрузки нужно рассылать в этом обработчике, что у вас и делалось в прошлой теме. Вам только местами две строчки поменять нужно было, т.к. вы событие рассылали до разбора данных, т.е. до вызова метода parsePlayerData, а значение переменной playerName у вас задается именно в этом методе.

А здесь вы уже нахимичили непонятно чего.

Nitr0geN 05.04.2010 13:46

udaaff спасибо большое! Просто я ничего тогда не понял! Сейчас все стало ясно после Вашего ответа и все заработало!

Огромное всем спасибо! И сори за то, что тупил так ) Просто мне пока сложно разобраться с логикой )))


Часовой пояс GMT +4, время: 12:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.