Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Parser A3D event.Complete (http://www.flasher.ru/forum/showthread.php?t=161037)

savva 20.07.2011 00:02

Parser A3D event.Complete
 
Здравствуйте.

Проблема стоит следующим образом.

Разработан пакет классов собственного парсера myxmlparser (xmlparser ,objitem,camitem). Всё передаётся нормально трейсится вывод правильный,в массивы объекты добавляются все данные заполняются и всё вроде бы хорошо.

В классе Сцены создаётся объект

Код:

urlXml:String=new String("fgdag.xml");
private function onContextCreate()
{
....
pars:xmlparser=new xmlparser(urlXml);
//тут производится создание объектов MyObject с помощью данных из массива объектов
//и добавляются на сцену

//Тоже самое с камерой
addeventListner(.....,onenterframe);
}

При попытке добавить что либо на сцену у меня в массивах объектов и камер пусто. null
Проблема в том,что я не понимаю как сделать так чтобы сначала произошла загрузка xml и запись данных в мои массивы(в пакете классов для парсера),а потом уже выполнялось создание объектов /камер и их добавление на сцену.

Добавлено через 13 часов 0 минут
Извините,вчера писал с дома исходники все на работе.

Вот сам парсер:
Код:


public class xmlpars
        {
                private var _xml:XML;
                public var objlist:Array;
                public var camlist:Array;
                public function xmlpars(url:String)
                {
                        objlist = new Array();
                        camlist = new Array();
                        var loader:URLLoader=new URLLoader(); 
                        loader.load(new URLRequest(url));
                        loader.addEventListener(Event.COMPLETE, loadXML); 
                }
               
        private function loadXML(e:Event):void 
                { 
                        _xml = new XML(e.target.data); 
                        trace(_xml);
                        parseXML(); 
                } 
                private function parseMyObj(obj:XMLList):void
                {
                        var texturearr:Array = new Array();
                        var textureobjarr:Array = new Array();
                        var objtext:Array = new Array();
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                        for (var q:Number = 0; q < object.textures.texture.length(); q++)
                                        {
                                                var t:Object = object.textures.texture[q];
                                                texturearr.push(t.texturesrc);
                                               
                                                textureobjarr.push(t.textureobj);
                                                objtext.push(t.text);
                                        }
                                var s:objItem = new objItem(object.name, object.model, texturearr,textureobjarr, object.@x
                        ,object.@y, object.@z,objtext);
                        objlist.push(s);
                        }
                }
                private function parseMyCam(obj:XMLList):void
                {
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                var s:camItem = new camItem(object.name, object.@farClipping, object.@nearClipping, object.@posx
                        ,object.@posy, object.@posz, object.@lookx
                        ,object.@looky, object.@lookz);
                        camlist.push(s);
                        }
                }
        private function parseXML():void{ 
                var objects:XMLList = _xml["objects"].child("object");
                parseMyObj(objects);
                var cameras:XMLList = _xml["cameras"].child("camera"); 
                parseMyCam(cameras);
        } 
        }
}

Далее в сцене создаётся :
pars:xmlparser=new xmlparser(urlXml);

Как сделать так чтобы сначала произошёл парсер,и только потом началось дальнейшее выполнение программы?

Kidd002 20.07.2011 14:22

Например можно наследоваться от EventDispatcher и отправлять событие при завершении работы парсера.
Парсер:
Код AS3:

package
{
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
 
        [Event(name="complete", type="flash.events.Event")]
        public class xmlpars extends EventDispatcher
        {
                private var _xml:XML;
                public var objlist:Array;
                public var camlist:Array;
 
                public function xmlpars()
                {
 
                }
 
                public function parse(url:String):void
                {
                        objlist = new Array();
                        camlist = new Array();
                        var loader:URLLoader = new URLLoader();
                        loader.load(new URLRequest(url));
                        loader.addEventListener(Event.COMPLETE, loadXML);
                }
 
                private function loadXML(e:Event):void
                {
                        _xml = new XML(e.target.data);
                        trace(_xml);
                        parseXML();
                }
 
                private function parseMyObj(obj:XMLList):void
                {
                        var texturearr:Array = new Array();
                        var textureobjarr:Array = new Array();
                        var objtext:Array = new Array();
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                for (var q:Number = 0; q < object.textures.texture.length(); q++)
                                {
                                        var t:Object = object.textures.texture[q];
                                        texturearr.push(t.texturesrc);
 
                                        textureobjarr.push(t.textureobj);
                                        objtext.push(t.text);
                                }
                                var s:objItem = new objItem(object.name, object.model, texturearr, textureobjarr, object.@x, object.@y, object.@z, objtext);
                                objlist.push(s);
                        }
                }
 
                private function parseMyCam(obj:XMLList):void
                {
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                var s:camItem = new camItem(object.name, object.@farClipping, object.@nearClipping, object.@posx, object.@posy, object.@posz, object.@lookx, object.@looky, object.@lookz);
                                camlist.push(s);
                        }
                }
 
                private function parseXML():void
                {
                        var objects:XMLList = _xml["objects"].child("object");
                        parseMyObj(objects);
                        var cameras:XMLList = _xml["cameras"].child("camera");
                        parseMyCam(cameras);
 
                        dispatchEvent(new Event(Event.COMPLETE));
                }
        }
}

Использование:
Код AS3:

urlXml:String=new String("fgdag.xml");
 
private function onContextCreate()
{
        //....
        pars:xmlparser=new xmlparser();
        pars.addEventListener(Event.COMPLETE, onParceComplete);
        pars.parse(urlXml);
 
}
 
private function onParceComplete(e:Event):void
{
        e.target.removeEventListener(Event.COMPLETE, onParceComplete);
 
        //тут производится создание объектов MyObject с помощью данных из массива объектов
        //и добавляются на сцену
 
        //Тоже самое с камерой
        addEventListner(.....,onenterframe);
}

Также можно использовать коллбэки.

savva 20.07.2011 15:29

Спасибо большое за ответ,всё заработало(почти :) ),сейчас буду свои косяки править.

Добавлено через 36 минут
Не хочу открывать новую тему,поскольку вопрос частично по этой теме.

Мне сказали что xml-ку надо хранить в Embed.

Я погуглил посмотрел пару примеров.

[Embed("FormMain.xml", mimeType="application/octet-stream")] private static const EmbedModel:Class;
прописываю в начале класса сцены.
Как я понимаю вызывать надо так new EmbedModel();
Вопрос такой,какой тип нужно передавать мне в процедуру парсера? На данный момент делается так :
Код:

urlXml:String=new String("fgdag.xml");
 
private function onContextCreate()
{
        //....
        pars:xmlparser=new xmlparser();
        pars.addEventListener(Event.COMPLETE, onParceComplete);
        pars.parse(urlXml);
 
}

и сам парсер
Код:

ublic function parse(url:String):void
                {
                        objlist = new Array();
                        camlist = new Array();
                        var loader:URLLoader = new URLLoader();
                        loader.load(new URLRequest(url));
                        loader.addEventListener(Event.COMPLETE, loadXML);
                }


Kidd002 20.07.2011 16:35

Тогда использовать события не нужно - у тебя нет загрузки и, соответственно, нет задержки.
Сразу передаем в функцию parse xml-ку и сразу берем ответ.
Парсер:
Код AS3:

package
{
 
        public class xmlpars
        {
                private var _xml:XML;
                public var objlist:Array;
                public var camlist:Array;
 
                public function xmlpars()
                {
 
                }
 
                public function parseXML(xml:XML):void
                {
                        _xml = xml;
                        var objects:XMLList = _xml["objects"].child("object");
                        parseMyObj(objects);
                        var cameras:XMLList = _xml["cameras"].child("camera");
                        parseMyCam(cameras);
                }
 
                private function parseMyObj(obj:XMLList):void
                {
                        var texturearr:Array = new Array();
                        var textureobjarr:Array = new Array();
                        var objtext:Array = new Array();
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                for (var q:Number = 0; q < object.textures.texture.length(); q++)
                                {
                                        var t:Object = object.textures.texture[q];
                                        texturearr.push(t.texturesrc);
 
                                        textureobjarr.push(t.textureobj);
                                        objtext.push(t.text);
                                }
                                var s:objItem = new objItem(object.name, object.model, texturearr, textureobjarr, object.@x, object.@y, object.@z, objtext);
                                objlist.push(s);
                        }
                }
 
                private function parseMyCam(obj:XMLList):void
                {
                        for (var i:Number = 0; i < obj.length(); i++)
                        {
                                var object:Object = obj[i];
                                var s:camItem = new camItem(object.name, object.@farClipping, object.@nearClipping, object.@posx, object.@posy, object.@posz, object.@lookx, object.@looky, object.@lookz);
                                camlist.push(s);
                        }
                }
 
        }
}

Использование:
Код AS3:

pars:xmlparser=new xmlparser();
 
//Получаем содержимое прикрепленной xml-ки
var file:ByteArray = (new EmbedModel()) as ByteArray);
var str:String = file.readUTFBytes( file.length );
var xml:XML = new XML( str );
 
//Парсим:
pars.parseXML(xml);
 
//Берем данные из pars и:
 
//тут производится создание объектов MyObject с помощью данных из массива объектов
//и добавляются на сцену
 
//Тоже самое с камерой
addEventListner(.....,onenterframe);


savva 20.07.2011 16:43

Спасибо большое.Всё работает.


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

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