Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по enter_frame и xml 
:(
    Опции темы
DooZ
Дата 21.5.2010, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



вопрос по enter_frame и xml
Здравствуйте,
я еще только учусь поэтому есть такого плана вопрос

есть главный класс Main который прикреплен к сцене, он собственно только обрабатывает другие классы (вызывает)
вот краткий пример:

Код

      public function Main():void
      {
         hero = new Hero(stage.stageWidth, stage.stageHeight);         
         addChild(hero);         
         addEventListener(Event.ENTER_FRAME, EnterFrame);
      }


собственно тут создается герой и добавляется на сцену
далее в методе EnterFrame происходит обновление сцены (в данном случае герой просто крутится)

Код

      private function EnterFrame(e:Event):void
      {         
         hero.Move();
      }


и вот подошли мы к классу Hero

Код

      public function Hero(stageWidth, stageHeight)
      {
         var XMLLoader:URLLoader = new URLLoader(new URLRequest("Data/Hero.xml"));
         XMLLoader.addEventListener(Event.COMPLETE, getXML);

         addChild(hero);
      }


далее

Код

      private function getXML(e:Event):void
      {
         e.target.removeEventListener(Event.COMPLETE, getXML);
         heroXML = new XML(e.target.data);
      }


и далее сам метод движения:

Код

      function Move():void
      {
                .......
                тут есть такой момент пример
                hero.rotation += heroXML.rotationSpeed;
       }


собственно без XML все отлично
т.е. если переменную например heroXML.rotationSpeed заменить числом, то все работает
оно и понятно, не нужно ждать загрузки XML
но в моем случае код начинает отрабатывать раньше, чем загрузился XML отсюда и ошибка
это я понимаю, но не понимаю как это исправить, а точнее как переписать, что бы все работало правильно и как надо

если что-то не понятно описал, сообщите, дополню smile

спасибо

.....

может как вариант грузить ВСЕ XML файлы, которые будут юзаться в программе сразу в Main классе и потом раздавать их в качестве параметров в новые классы? типа

new Hero(heroXML);
new Buller(bulletXML);

и т.д.?

на сколько это верно и правильно с точки зрения профессионального программирования и удобства?
PM MAIL   Вверх
DooZ
Дата 21.5.2010, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



немного пример переделал что бы более кратко было и понятно

главный класс Main

Код

    public class Main extends MovieClip
    {
        var xmlList:Object;
        
        public function Main():void
        {
            var xml:XMLLoader = new XMLLoader("Data/Hero.xml");
                        trace(xml);
                }
         }


и класс XMLLoader

Код

package
{
    import flash.events.Event;
    import flash.net.URLLoader;
    import flash.net.URLRequest;

    public class XMLLoader
    {
        var xml:XML;
        
        public function XMLLoader(file:String):void
        {
            var loader:URLLoader = new URLLoader(new URLRequest(file));
            loader.addEventListener(Event.COMPLETE, loadedXML);
        }
        
        private function loadedXML(e:Event):void
        {
            e.target.removeEventListener(Event.COMPLETE, getXML);
            xml = new XML(e.target.data);
        }
    }
}


вот собственно и вопрос
как получить загруженные данные xml в классе Main и соответственно продолжить работу уже с загруженными данными..
вот как-то так  smile 
помогите, запутался
PM MAIL   Вверх
bars80080
Дата 21.5.2010, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



то есть ошибка в том, что метод

  private function EnterFrame(e:Event):void
      {         
         hero.Move();
      }

вызывается раньше, чем будет загружен класс?


ну, так запускай слушатель enterframe только когда загрузится класс. то есть перенеси addEventListener(Event.ENTER_FRAME, EnterFrame); в private function getXML(e:Event):void

это самое простое


есть более гибкий, но тяжеловатый вариант. сделай специальный массив, где каждый элемент - метод который нужно отыграть.
к примеру:

Код

var ee:Array = new Array();
ee[0] = [func1, 10];
ee[1] = [func2, 1];
// [метод, сколько раз надо его вызвать (0 - бесконечно)]


далее изменяем обработчик:

Код

      private function EnterFrame(e:Event):void {         
         var c:int = ee.length;
         for(var i:int = 0; i < c; i++) {
             ee[i][0]();
             if(ee[i][1] > 1) { ee[i][1]--; }
             else if(ee[i][1] == 1) { ee.splice(i, 1); i--; c = ee.length; }
         }
      }


теперь по загрузке мы можем добавлять события:
Код

      private function getXML(e:Event):void {
         e.target.removeEventListener(Event.COMPLETE, getXML);
         heroXML = new XML(e.target.data);
         ee[ee.length] = [move, 0];
      }


конечно, может быть придётся немного перестроить структуру, зато будет всего один обработчик

Это сообщение отредактировал(а) bars80080 - 21.5.2010, 19:24
PM MAIL WWW   Вверх
DooZ
Дата 21.5.2010, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



второй способ реально немного сложный smile

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

в каждом классе вызывать свой слушатель ENTER_FRAME помоему не правильно? или я ошибаюсь?
PM MAIL   Вверх
DooZ
Дата 21.5.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



Опять же, насчет вызова enter_frame внутри метода getXML после загрузки
дело в том, что файлов XML с параметрами (с данными) несколько... т.к. для каждого класса свои
и соответсвенно вызывать каждый раз enter_frame не вариант...
PM MAIL   Вверх
bars80080
Дата 22.5.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



Цитата(DooZ @  21.5.2010,  19:52 Найти цитируемый пост)
соответсвенно вызывать каждый раз enter_frame не вариант... 

именно поэтому я и предложил второй вариант, где enterframe вызывается всего один раз
PM MAIL WWW   Вверх
DooZ
Дата 22.5.2010, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 25.11.2005

Репутация: нет
Всего: 1



ок будем пробывать
хотелось бы еще услышать мнения на этот счет от других участников
может есть более изящные способы?

просто второй вариант уж больно не красив в плане реализации... не верю я, что нет других способов smile
PM MAIL   Вверх
Ramirez
Дата 28.5.2010, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

Репутация: нет
Всего: 5



Цитата(DooZ @  21.5.2010,  19:10 Найти цитируемый пост)
как получить загруженные данные xml в классе Main и соответственно продолжить работу уже с загруженными данными..

как вариант, в конструктор XMLLoader передавать еще ссылку на переменную, в которую нужно сохранить результат. это если все равно гдето есть цикл в котором можно эту переменную проверять. затевать цикл только ради проверки наличия данных мне кажется накладно.
или
ссылку на функцию которую следует вызвать по завершении загрузки (из метода loadedXML) и передать ей xml. эдакий callback.

в любом случае, мне кажется, не выйдет в одной функции инициализировать XMLLoader и получить результат (ну цикл вроде OnEnterFrame не рассматриватеся, поскольку это оверхед, на мой взгляд), т.к. процесс асинхронный. 



Это сообщение отредактировал(а) Ramirez - 28.5.2010, 18:55
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.0540 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.