|
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
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); } Проблема в том,что я не понимаю как сделать так чтобы сначала произошла загрузка 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); Как сделать так чтобы сначала произошёл парсер,и только потом началось дальнейшее выполнение программы? |
|
|||||
Например можно наследоваться от EventDispatcher и отправлять событие при завершении работы парсера.
Парсер: 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)); } } } 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); } |
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
Спасибо большое за ответ,всё заработало(почти ),сейчас буду свои косяки править.
Добавлено через 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); } Последний раз редактировалось savva; 20.07.2011 в 16:06. |
|
|||||
Тогда использовать события не нужно - у тебя нет загрузки и, соответственно, нет задержки.
Сразу передаем в функцию parse xml-ку и сразу берем ответ. Парсер: 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); } } } } 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); |
|
|||||
[+ 06.08.11]
Регистрация: Jul 2011
Сообщений: 79
|
Спасибо большое.Всё работает.
Последний раз редактировалось savva; 21.07.2011 в 15:17. Причина: Вопрос снят,нашёл ответ сам. |
Часовой пояс GMT +4, время: 17:25. |
|
« Предыдущая тема | Следующая тема » |
|
|