Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Flash Приложения: AIR, Zinc и тд. (http://www.flasher.ru/forum/forumdisplay.php?f=94)
-   -   Не могу загрузить xml в Zinc (http://www.flasher.ru/forum/showthread.php?t=198624)

pomuс 01.05.2013 02:17

Не могу загрузить xml в Zinc
 
Добрый вечер
Дело какое -захотел освоить Zinc на таком уровне, чтобы можно было упаковывать некоторые приложения. При попытке до этого столкнулся с тем, что для подгрузки внешних файлов и видео надо использовать "местные" зинковские классы.
Долго искал, разбирался, как подключать библиотеки и т.д.. С горем пополам подключил, но понятия не имел с чего начать переделку проекта.
все мои поиски привели меня к такой строке
Код AS3:

loader.load(new URLRequest(mdm.Application.path+"that.xml"));

файл реально существует в директории флешки, но при компиляции мне выдает что неверный адрес.
Также при компиляции ругается на переменные событий (или на сами события, не пойму) , например
(e:Event).
В общем муть какая то. Мне всего то надо немного переписать проект, чтобы грузились нужные мне файлы из вне.
Но самое интересное ен понятно как этому научится самостоятельно. Их "guide" не раскрыл мне вообще ничего, большенство примеров приведены в AS2, а работаю я только с AS3.

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

Добавлено через 56 часов 38 минут
интересно, 280 просмотров и никто никогда не задавался таким вопросом?

alexcon314 06.05.2013 22:06

Задавались и не раз во времена, когда здесь обсуждение цинка было популярно, поиск же есть..
По теме.
1.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        public class Main extends Sprite
        {
                var loader:URLLoader = new URLLoader();
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
 
                        loader.addEventListener(Event.COMPLETE, onLoad);
                        loader.load(new URLRequest("c:\\myFile.txt"));
 
 
                }
                private function onLoad(e:Event):void
                {
                        trace(loader.data);
                }
        }
 
}

прекрасно работает (само-собой, файл лежит по указанному пути). Т.е. вам нужно убедиться в том, что
выражение (mdm.Application.path+"that.xml") дает действительно валидный путь. Ну, и о том что загрузка файлов во флеше асинхронно происходит, конечно, тоже надо помнить. На то в примере присутствует обработчик события Event.COMPLETE, заметьте.
2. Не знаю, чем вам доки не угодили по цинку, лаконично, но по делу.
Код AS3:

var myTextData:String = mdm.FileSystem.loadFile("c:\\myFile.txt");

Тут чисто оболочка вам файл загрузит, причем синхронно. Код несколько проще, да? И работать будет хоть в AS2, хоть в AS3, без разницы, опять же, при условии, что путь валидный.
3.
Цитата:

файл реально существует в директории флешки, но при компиляции мне выдает что неверный адрес.
Также при компиляции ругается на переменные событий (или на сами события, не пойму) , например
(e:Event). В общем муть какая то.
Вы своими разъяснениями муть только усугубили, ибо не понятно вообще ничего, кто и чего при компиляции выдает и на что ругается?
Приведите пример проблемного кода и ошибки.
4. На чем собираете приложение? В смысле IDE какая, цинк какой?
5. И последнее. У цинка, в принципе, неплохое коммьюнити, форум хороший, есть масса готовых примеров. Если вы хотите нормально цинком пользоваться, а не блуждать в потемках, рекомендую потратить время на изучение.

pomuс 13.05.2013 10:37

1. указываю я путь не по жесткому диску, а относительно проекта. То есть that.xml лежит в той же директории с swf и зинковским exe.
2. так оказывается одной строчкой идет загрузка? а я вставлял это в request. Ну вот опять же - откуда это знать если в доках такая скупая информация а в примерах черт ногу сломит
3. Ок, сделал я так как написали, эффект с событиями тот же.
Код AS3:

public function Main():void 
{
        if (stage) init();
        else addEventListener(Event.ADDED_TO_STAGE, init);
}
 
private function init(e:Event = null):void
{
        removeEventListener(Event.ADDED_TO_STAGE, init);
        tf                        = new TextField();
        addChild(tf);
 
        var myTextData:XML= new XML(mdm.FileSystem.loadFile("that.xml"));
}

в этом случае при компиляции swf подсвечивается
private function init(e:Event = null):void с текстом ошибки
Код AS3:

Can not resolve a multiname reference unambiguously. mdm:Event (from C:\Users\Home\Desktop\testZinc\lib\mdm_swc.swc(mdm:Event)) and flash.events:Event (from C:\Program Files (x86)\FlashDevelop\Tools\flexsdk\frameworks\libs\player\10.1\playerglobal.swc(flash.events:Event)) are available.
C:\Users\Home\Desktop\testZinc\src\Main.as(25): col: 27 Error: Type was not found or was not a compile-time constant: Event.
private function init(e:Event = null):void

и так со всеми событиями в коде.
4. собираю в FlashDevelop. И вот еще про "доки" цинка.... ни слова о подключении к flashDevelop. Нашел инфу тут, на форуме, где написано что надо разместить swc в папке library в самом develop. Разместил, испортировал -- ничего не видит. Получилось только после того как подключил сам swc в библиотек проекта (/lib)
5. скачал и пересмотрел все "примеры". Как я и писал уже , с as3 примеров кот наплакал, а из того что есть ничего не понял, и ничто не касалось загрузки файла

Партизан 13.05.2013 20:29

У вас конфликт имен.
Для листенеров цинка везде пишите e:mdm.Event

alexcon314 14.05.2013 10:07

Ок. Попробуйте так. В FD создать проект AS3. В классе Main прописать
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import mdm.*
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
                private var tf:TextField = new TextField();
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(flash.events.Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:flash.events.Event = null):void
                {
                        removeEventListener(flash.events.Event.ADDED_TO_STAGE, init);
                        // entry point
                        addChild(tf);
                        tf.x = tf.y = 0;
                        tf.width = stage.stageWidth;
                        tf.height = stage.stageHeight;
 
                        mdm.Application.init();
                        mdm.Dialogs.prompt("Hello World!");
                        var myTextData:String = new XML(mdm.FileSystem.loadFile("myfile.txt"));
                        tf.text = myTextData;
                }
 
        }
 
}

Чтобы избавиться от конфликта имен, имортируйте из mdm_swc требуемые классы, а не все подряд (import mdm.* - не корректно)
Вот так компилится нормально и текст из файла вполне отображается
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import mdm.Dialogs;
        import mdm.FileSystem;
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
                private var tf:TextField = new TextField();
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        addChild(tf);
                        tf.x = tf.y = 0;
                        tf.width = stage.stageWidth;
                        tf.height = stage.stageHeight;
 
                        mdm.Application.init();
                        mdm.Dialogs.prompt("Hello World!");
                        var myTextData:String = new XML(mdm.FileSystem.loadFile("myfile.txt"));
                        tf.text = myTextData;
                }
 
        }
 
}


pomuс 15.05.2013 10:55

ну вот какой то сдвиг есть - сделал частичный импорт классов, и конфликт с событиями ушел. Но вот в остальном....
вот незамысловатый тестовый xml
Код AS3:

<?xml version="1.0" encoding="utf-8" ?>
<data>
        <content>
                <tag>TEST</tag>
        </content>
</data>

тупо делаю copy paste ваш код, и тестовое поле не отображает ничего. При трейсе выдает пустую строку (даже не null, а просто пусто). В папке с флешкой я сделал и that.xml и that.txt. Пробовал и так и так.
+ко всему для взятия xml логично было бы написать
Код AS3:

var xml:XML                                = new XML(mdm.FileSystem.loadFile("that.xml"));
trace (xml);

но и тут трейс выдает пустую строку, а trace (xml.children().length()); выдает 0.
Что то я вообще не вкуриваю...

alexcon314 15.05.2013 12:40

Попрежнему, у вас проблема с путями.
Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import mdm.Dialogs;
        import mdm.FileSystem;
        import mdm.Application;
 
        /**
        * ...
        * @author
        */

        public class Main extends Sprite
        {
                private var tf:TextField = new TextField();
                public function Main():void
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // entry point
                        addChild(tf);
                        tf.x = tf.y = 0;
                        tf.width = stage.stageWidth;
                        tf.height = stage.stageHeight;
                        var path:String = mdm.Application.path + "myText.xml";
                        //var path:String = "myText.xml";
                        mdm.Application.init();                       
                        if (!mdm.FileSystem.fileExists(path))
                        {
                                mdm.Dialogs.prompt("XML file '" + path + "' not found!");
                        }
                        else
                        {
                                var myTextData:XML = new XML(mdm.FileSystem.loadFile(path));
                                tf.text = myTextData;
                        }
                }
 
        }
 
}

xml-файл при таком подходе должен лежать в папке с ехе.

pomuс 15.05.2013 13:11

Сейчас все заработало в оболочке.
Так оказывается что все эти модификации ссылок и загрузок под Zinc будут отображать содержимое только в оболочке? То есть варианта проверить работоспособность скриптов в самом SWf через FD возможности нету?

Страшно предположить как же тогда грузить не только xml а и все видео и внешние файлы..
Позвольте уточнить, про загрузки
Цитата:

"Тут чисто оболочка вам файл загрузит, причем синхронно."
Как понять синхронно? Если в флеше у нас вешается событие Complete, то как определяется когда загрузится в оболочке? не может же он (zinc) загрузить видео на 100 мб мгновенно по запросу.

alexcon314 15.05.2013 14:05

Цитата:

Сейчас все заработало в оболочке.
Как оказалось, проблема была не в путях :D. Нет, ну кто бы мог подумать...
Все mdm-классы работают исключительно в оболочке. На то она и оболочка, иначе нафига огород городить?
Цитата:

Страшно предположить как же тогда грузить не только xml а и все видео и внешние файлы..
Ну, во флеше-то вы как-то их собирались грузить? Что же тут страшного? Делайте проверку на существование файла, на валидность загруженных данных, IOError ловите в конце концов... стандартная рутина в любом приложении.
Не знаю как в четвертом цинке, но раньше у них была возможность дебажить приложение прямо из ехе, правда очень скромная такая возможность..
Вообще, можно определенным образом скомпоновать приложение, чтобы свести усилия по дебагу к минимуму, скажем, разделить функционал четко: это будет делать оболочка, это будет делать флеш.
Обернуть mdm-классы в свой флешовый класс, который будет именно нужным вам образом взаимодействовать с вашими классами, а не разбрасывать по-всюду вызовы mdm-объектов.. ну, или как-то так...
Что касается загрузки внешних файлов - да, можно грузить стандартно, флешовым лоадером, а через mdm-классы только определять путь к файлу, ибо флеш так не может. А можно грузить через оболочку, т.е. через методы mdm-классов. Тут выбор за вами.
Как понять синхронно? Так и понимать, собственно. Вызов mdm.FileSystem.loadFile() вернет вам содержимое файла в той же строчке кода. Это не значит, что огроменный файл загрузится сию же секунду, это означает, что выполнение кода приостановится до окончания загрузки. И, как следствие, может притормозить интерфейсная графика.
Во флеше загрузка реализована асинхронно, т.е. после вызова loader.load(new URLRequest("c:\\myFile.txt")) сразу же будет выполнена следующая инструкция в коде, не будет ожидания окончания загрузки. О ее завершении вас известит специальное событие Event.COMPLETE, на которое надо не забыть подписаться до началда загрузки и только в его обработчике уже будут доступны загруженные данные. Т.е. схема несколько сложнее, зато без тормозов.
Впрочем, у цинка что-то тоже было асинхронное, сейчас точно не скажу... надо порыться в доках.

UPD/
Неа... там только FileSystem.appendFileAsync(), FileSystem.copyFileAsync(), FileSystem.deleteFileAsync(), что касается файлов.
mdm.FileSystem.loadFileAsync() не наблюдается, видимо, потому, что это есть и так во флеше.

pomuс 15.05.2013 14:45

так вот оно в чем дело в итоге! оказывается можно все также грузить внешние файлы и во флеше, просто с использованием
Код AS3:

mdm.Application.path + "myText.xml"

я же могу сделать так?
Код AS3:

var loader:Loader = new Loader();
loader.load(new URLRequest(mdm.Application.path + "myText.xml"));
loader.addEventListener(Event.COMPLETE, lalala);

это была моя самая первая мысль, и я так сначала и делал, но тут натолкнулся на конфликт Event , о котором писал выше, т.к. подключал весь пакет. И потом уже сутки прошарил все эти темы, форумы и гугл, в поисках объяснения. Вот кстати почему я и гвоорил, что доки у них ну просто караул, а вернее не доки, а вводная информация и туториалы


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

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