Загрузка внешнего xml на AS3

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
wierusna
Сообщения: 137
Зарегистрирован: 13 ноя 2011, 18:40

Загрузка внешнего xml на AS3

Сообщение wierusna »

Недавно взялся за изучение AS3 и вот, как это обычно бывает с новичками, мне нужна помощь спецов.
Хочу сделать галерею, в которую будут подгружаться фото с внешнего xml файла, в котором прописаны ссылки на фото.

Нужна такая схема
файл swf будет открываться на html странице и считывать ссылки на фото с внешнего xml (например отсюда http://www.site.ru/flapps.xml). Фото будут лежать в той же директории, что и xml.
Вот структура xml

Код: Выделить всё

 <?xml version="1.0" encoding="utf-8"?><tree>    <node label="Галерея 1">        <node label="картинка 1" src="DCP_0730.jpg" />        <node label="картинка 2" src="DCP_0731.jpg" />        <node label="картинка 3" src="DCP_0732.jpg" />        <node label="картинка 4" src="DCP_0733.jpg" />        <node label="картинка 5" src="DCP_0734.jpg" />    </node>            <node label="Галерея 2">        <node label="картинка 1" src="DCP_0730.jpg" />        <node label="картинка 2" src="DCP_0731.jpg" />        <node label="картинка 3" src="DCP_0732.jpg" />        <node label="картинка 4" src="DCP_0733.jpg" />        <node label="картинка 5" src="DCP_0734.jpg" />    </node></tree>   

Есть код на AS2 (нужно перевести его на AS3). В нем идет подзагрузка локального xml (мне же нужна подзагрузка внешнего xml)

Код: Выделить всё

 var my_pb:mx.controls.ProgressBar;var my_ldr:mx.controls.Loader;var my_tree:mx.controls.Tree; my_pb._visible = false;my_pb.indeterminate = true;my_pb.setSize(160, 30);my_pb.source = my_ldr;my_pb.mode = "polled";var pbListener:Object = new Object();pbListener.complete = function(evt:Object) {    evt.target._visible = false;};my_pb.addEventListener("complete", pbListener); var treeDP_xml:XML = new XML();treeDP_xml.ignoreWhite = true;treeDP_xml.onLoad = function(success:Boolean) {    if (success) {        my_tree.dataProvider = this.firstChild;    }}; treeDP_xml.load("gallery_tree.xml");var treeListener:Object = new Object();treeListener.change = function(evt:Object) {    var treeNode:XMLNode = evt.target.selectedItem;    if (treeNode.attributes.src != undefined) {        my_pb._visible = true;        my_ldr.load(treeNode.attributes.src);    }};my_tree.addEventListener("change", treeListener);   
На сцене расположено 3 объекта:
1.my_tree - это древовидный список фотографий
2.my_ldr - это поле, в которой подгружается фотография, выбранная из списка my_tree
3.my_pb - это прогресс бар, который показывает степень загрузки фото.


Читал статьи о том, как нужно подгружать внешний xml на AS3 (но так, как верхний код написан на AS2, мне сложно разобраться - я новичек)
Вот пример на As3

Код: Выделить всё

  import flash.net.*; import flash.events.*; import flash.display.Sprite; import flash.text.TextField;  var loader:URLLoader = new URLLoader(); loader.load(new URLRequest("http://mega-tv.do.am/xmltest/myxml.xml?rand="+Math.round(Math.random()*uint.MAX_VALUE))); loader.addEventListener(Event.COMPLETE,onComplete); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError); loader.addEventListener(IOErrorEvent.IO_ERROR,ioError);    function onComplete(event:Event):void { var myxml:XML = XML(event.target.data); var mywidth:uint = parseInt(myxml.mywidth.text(),10); var myheight:uint = parseInt(myxml.myheight.text(),10); var mycolor:uint = parseInt(myxml.mycolor.text(),16); var mytext:String = myxml.mytext.text(); var sprite:Sprite = new Sprite(); sprite.graphics.beginFill(mycolor,1); sprite.graphics.drawRect(0,0,mywidth,myheight); sprite.graphics.endFill(); addChild(sprite); sprite.x = 50; sprite.y = 50;  var txtField:TextField = new TextField(); txtField.width = mywidth; txtField.height = myheight; txtField.multiline = true; txtField.wordWrap = true; txtField.htmlText = mytext; sprite.addChild(txtField); }  function securityError(event:SecurityErrorEvent):void {  trace("SecurityErrorEvent"); } function ioError(event:IOErrorEvent):void { trace("IOErrorEvent"); }  

Как написал автор, эта часть кода служит для загрузки обновленной версию xml
(Я собираюсь часто обновлять xml файл....добавлять в него новые ссылки на фото)

Код: Выделить всё

loader.load(new URLRequest("http://mega-tv.do.am/xmltest/myxml.xml?rand="+Math.round(Math.random()*uint.MAX_VALUE))); 

Прошу, помогите мне объединить эти два куска кода на разных версиях AS в один код на AS3.



Вот ссылки на файлы с исходниками
1. Первый код на AS2 http://rghost.ru/40880197
2. Второй код на AS3 http://rghost.ru/40880232
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение sanych_dv »

Код: Выделить всё

 package{        import com.greensock.loading.XMLLoader;    import com.greensock.events.*;    import flash.display.Sprite;    import flash.events.Event;        public class Main extends Sprite    {                public function Main():void        {            stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);        }                private function init(e:Event = null):void        {            removeEventListener(Event.ADDED_TO_STAGE, init);                        var xmlLoader:XMLLoader = new XMLLoader("myxml.xml", {name: "myXml", noCache: true, autoDispose: true, onComplete: onXmlComplete, onError: onXmlError}); // локальный или внешний xml            xmlLoader.load();                }                private function onXmlComplete(e:LoaderEvent):void        {            var xml:XML = e.currentTarget.getContent("myXml");                        for each (var node0:XML in xml.node)            {                                trace(node0.@label);                                for each (var node1:XML in node0.children())                {                    trace(node1.@label, node1.@src);                }                            }                }                private function onXmlError(e:LoaderEvent):void        {            trace("error " + e.target + ": " + e.text);        }        } } 
Документация com.greensock: http://www.greensock.com/as/docs/tween/
wierusna
Сообщения: 137
Зарегистрирован: 13 ноя 2011, 18:40

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение wierusna »

Как скачать данные библиотеки ?
sanych_dv писал(а):

Код: Выделить всё

 
    import com.greensock.loading.XMLLoader;
    import com.greensock.events.*;

[/quote]


Идеально было бы, если бы вы переделали тот код, который я написал выше.  Я новичок и мне будет сложно написать целостный код для моих целей( Ну или хотя бы чтение строк из структуры xml (приведена выше) И вывод данных в поля на сцене.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение sanych_dv »

wierusna
Библиотеки здесь: http://www.greensock.com

Идеально, когда человек сам работает, а не просит писать за него код ) Чтение из XML в моем примере реализовано.
wierusna
Сообщения: 137
Зарегистрирован: 13 ноя 2011, 18:40

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение wierusna »

sanych_dv писал(а):wierusna
Библиотеки здесь: http://www.greensock.com

Идеально, когда человек сам работает, а не просит писать за него код ) Чтение из XML в моем примере реализовано.
Я не могу найти кнопку СКАЧАТЬ на этом сайте http://www.greensock.com (возможно там нет такой задумки?)
Идеально будет, если я буду учится на примерах, ход действий я понимаю, но мне не хватает практики...(не могу написать код, ибо глаз не заточен под всякие : ; " " ' ' = и тд. Код не будет работать, если пропущен или наоборот не там вписан один из символов.) Для этого нужны пример.
Это тоже самое, когда начинаешь учить англ. язык. Понимать - понимаешь, а сказать не можешь т.к. не хватает практики.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение sanych_dv »

ПЦ. Как можно вообще работать с языком, не зная синтаксиса? Не пользуясь отладчиком?

Да, с легендарной библиотекой от гринсока я поторопился, каюсь ) У них действительно нет кнопки "СКАЧАТЬ". Вот уроды! Я им, ***ть, напишу об этом )))
wierusna
Сообщения: 137
Зарегистрирован: 13 ноя 2011, 18:40

Re: Загрузка внешнего xml на AS3 (ПОМОГИТЕ МНЕ)

Сообщение wierusna »

sanych_dv писал(а):ПЦ. Как можно вообще работать с языком, не зная синтаксиса? Не пользуясь отладчиком?
Да, с легендарной библиотекой от гринсока я поторопился, каюсь ) У них действительно нет кнопки "СКАЧАТЬ". Вот уроды! Я им, ***ть, напишу об этом )))
Смешно .... :?

Сделал так...создал файл Main.as и написал в нем это, предварительно скачав класы с http://www.greensock.com и положив их в папку с проектом

Код: Выделить всё

          package    {               import com.greensock.loading.XMLLoader;        import com.greensock.events.*;        import flash.display.Sprite;        import flash.events.Event;               public class Main extends Sprite        {                                        public function Main():void            {                stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);            }                       private function init(e:Event = null):void            {                removeEventListener(Event.ADDED_TO_STAGE, init);                               var xmlLoader:XMLLoader = new XMLLoader("doc.xml", {name: "myXml", noCache: true, autoDispose: true, onComplete: onXmlComplete, onError: onXmlError}); // локальный или внешний xml                xmlLoader.load();                       }                       private function onXmlComplete(e:LoaderEvent):void            {                var xml:XML = e.currentTarget.getContent("myXml");                               for each (var node0:XML in xml.node)                {                                       trace(node0.@label);                                       for each (var node1:XML in node0.children())                    {                        trace(node1.@label, node1.@src);                    }                                   }                       }                       private function onXmlError(e:LoaderEvent):void            {                trace("error " + e.target + ": " + e.text);            }               }         }      
Далее создал файл test.fla и прописал в первом кадре это

Код: Выделить всё

   import Main; 
ошибок при компиляции нет....что дальше делать не понимаю :x
Аватара пользователя
Александр
Создатель сайта
Создатель сайта
Сообщения: 4574
Зарегистрирован: 27 сен 2009, 16:45

Re: Загрузка внешнего xml на AS3

Сообщение Александр »

wierusna
http://flapps.ru/forum/topic3.html - только 6 пункт, чтобы правильно подключить Main.as
wierusna
Сообщения: 137
Зарегистрирован: 13 ноя 2011, 18:40

Re: Загрузка внешнего xml на AS3

Сообщение wierusna »

Александр писал(а):wierusna
http://flapps.ru/forum/topic3.html - только 6 пункт, чтобы правильно подключить Main.as
Спасибо, подключил. А в чем разница между import Main; и подключением, как в 6 пункте.
Что делать после того как подключил? Я по прежнему не знаю как написать код правильно.

Пробовал что то написать...получилось вот что http://mega-tv.do.am/MUSOR100/galerry.swf
Вот код

Код: Выделить всё

 import flash.net.URLRequest;import flash.events.Event; var XMLLoader:URLLoader = new URLLoader (new URLRequest("http://mega-tv.do.am/MUSOR100/img.xml"));var XMLData:XML;var XMLlist:XMLList;var PicLoader:Loader;   XMLLoader.addEventListener(Event.COMPLETE, getXML); function getXML (e:Event):void {    XMLData = XML(e.target.data);    XMLlist = XMLData.children();        for (var i:int=0; i<XMLlist.length(); i++)    {        var PicLoader:Loader = new Loader();        PicLoader.load(new URLRequest(XMLlist[i].attributes()[1]));        PicLoader.x=20;        PicLoader.y= 115*i+20;        PicLoader.name = XMLlist[i].attributes()[0];        addChild(PicLoader);                PicLoader.addEventListener(MouseEvent.CLICK, showpic);        }                function showpic(e:MouseEvent):void        {            var PicLoader:Loader = new Loader();            PicLoader.load(new URLRequest(e.target.name));            PicLoader.x= 300;            PicLoader.y= 20;            addChild(PicLoader);        }}  

Нашел TransformTool http://www.senocular.com/demo/Transform ... mTool.html
(Скачать пакет можно там же)

Возникла проблема ....Если соединить эти два кода, то квадраты будут над изображениями (а нужно сделать наоборот) Что бы картинки можно было наложить на квадраты.
Я так понимаю это происходит потому, что addChild добавляет картинки поверх всех слоев. Мне кажется нужно сделать так, что бы addChild добавлял картинки уже в существующий контейнер, который лежит внизу всех слоев. Или я не прав?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Загрузка внешнего xml на AS3

Сообщение sanych_dv »

Код: Выделить всё

 package{        import com.greensock.loading.*;    import com.greensock.events.*;    import com.greensock.*;    import flash.display.MovieClip;    import flash.display.Sprite;    import flash.events.*;        public class Main extends Sprite    {                private var _loc:Object = {};                public function Main():void        {            stage ? init() : addEventListener(Event.ADDED_TO_STAGE, init);        }                private function init(e:Event = null):void        {            removeEventListener(Event.ADDED_TO_STAGE, init);                        // создаем контейнер для большой картинки                        _loc["bigBox"] = new MovieClip;            _loc["bigBox"].x = 300;            _loc["bigBox"].y = 20;            addChild(_loc["bigBox"]);                        // создаем загрузчик XML                        var xmlLoader:XMLLoader = new XMLLoader("http://mega-tv.do.am/MUSOR100/img.xml", {name: "myXml", noCache: true, autoDispose: true, onComplete: onXmlComplete, onError: onLoaderError}); // локальный или внешний xml            xmlLoader.load();                }                private function onXmlComplete(e:LoaderEvent):void        {                        // создаем загручик мелких картинок                        var smallPicLoader:LoaderMax = new LoaderMax({onError: onLoaderError, autoDispose: true});                        var cnt:int = 0;                        var xml:XML = e.currentTarget.getContent("myXml");                        // получаем аттрибуты                        for each (var img:XML in xml.children())            {                                // создаем контейнеры для мелких картинок                _loc["smallBox" + cnt] = new MovieClip;                _loc["smallBox" + cnt].x = 20;                _loc["smallBox" + cnt].y = 115 * cnt + 20;                _loc["smallBox" + cnt].link = img.@big;                _loc["smallBox" + cnt].buttonMode = true;                _loc["smallBox" + cnt].mouseChildren = false;                                // навешиваем слушатель на контейнеры                _loc["smallBox" + cnt].addEventListener(MouseEvent.CLICK, showPic);                addChild(_loc["smallBox" + cnt]);                                // подключаем загрузчики мелких картинок                smallPicLoader.append(new ImageLoader(String("http://mega-tv.do.am/MUSOR100/" + img.@small), {container: _loc["smallBox" + cnt], autoDispose: true, smoothing: true, centerRegistration: false, scaleMode: "none", alpha: 0, onComplete: onImageLoaderComplete}));                cnt++;            }                        // включаем загрузку мелких картинок            smallPicLoader.load();                }                private function onImageLoaderComplete(e:LoaderEvent):void        {            TweenLite.to(e.currentTarget.content, 0.5, {alpha: 1});                }                private function showPic(e:MouseEvent):void        {            // грузим большую картинку            var bigPicLoader:ImageLoader = new ImageLoader(String("http://mega-tv.do.am/MUSOR100/" + e.currentTarget.link), {container: _loc["bigBox"], autoDispose: true, smoothing: true, centerRegistration: false, scaleMode: "none", alpha: 0, onComplete: onImageLoaderComplete})            bigPicLoader.load();        }                private function onLoaderError(e:LoaderEvent):void        {            trace("error " + e.target + ": " + e.text);        }        } } 
файл: http://zalil.ru/33850218
Ответить