Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с созданием внутреннего прелоадера во Flash Builder 4.7 (http://www.flasher.ru/forum/showthread.php?t=203086)

gadzhimari 30.08.2013 14:48

Проблема с созданием внутреннего прелоадера во Flash Builder 4.7
 
Добрый день. С этой проблемой уже намучался пару дней, но нормального решения проблемы так и не нашел. До того как спрашивать, прочитал множество постов связанных с этой темой и на этом форуме тоже, но не помогло. В чем суть, т.к. флексовый мета-тег [Frame(factoryClass)] во Flash Builder 4.7 уже не поддерживается, выходит ошибка 1065 Variable Main is not defined, я использовал в данном случае ключ компилятора -frame two Main - где Main имя документ-класса. Так вот в кач-ве примера работы прелоадера взял игру написанную с использованием движка flixel. В кач-ве документ-класса сделал класс игры Mode.as. Протестировал работу прелоадера вначале в Adobe Flash CS4 в опции View - Simulate Download, так вот полосы загрузки я не увидел, вначале появился белый экран, а затем саму игра. Далее попробовал сделать класс Preloader.as документ-классом, и это тоже не решило проблему. Затем использовал в denwer вместе с Charles HTTP Debug Proxy в нем есть опция throttling c заданием пропускной способности. В этом случае тоже не увидел полосу загрузки. По этому поводу я записал видео, в котором показывается, как я тестировал работу прелоадера в Flash IDE. Вообщем народ не могли вы подробным образом описать в чем может быть проблема и как её решить.

KumoKairo 30.08.2013 15:05

Мета тэги не зависят от среды исполнения, они вшиты во флекс СДК, в компилятор.
Простой прелоадер можно сделать так (на примере измененного темплейта FlashDevelop)
Мейн класс (точка входа в программу, обычно обозначается отличным от других классов значком):
Код AS3:

package 
{
        [Frame(factoryClass = "Preloader")]
        public class Main extends Sprite
        {
                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
                }
        }
}

Класс Preloader (в том же пакете, что и Main.as)
Код AS3:

package 
{
        public class Preloader extends Sprite
        {
                public function Preloader()
                {
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);
 
                        // TODO show loader
                }
 
                private function ioError(e:IOErrorEvent):void
                {
 
                }
 
                private function progress(e:ProgressEvent):void
                {
                        var percentage:Number = e.bytesLoaded / e.bytesTotal;
                        if(percentage == 1)
                        {
                                loadingFinished();
                        }
                }
 
                private function loadingFinished():void
                {
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);
 
                        // TODO hide loader
                        startup();
                }
 
                private function startup():void
                {
                        var mainClass:Class = getDefinitionByName("Main") as Class;
                        addChild(new mainClass() as DisplayObject);
                }
        }
}


gadzhimari 30.08.2013 15:33

Вложений: 1
Цитата:

Сообщение от KumoKairo (Сообщение 1145119)
Мета тэги не зависят от среды исполнения, они вшиты во флекс СДК, в компилятор.
Простой прелоадер можно сделать так (на примере измененного темплейта FlashDevelop)
Мейн класс (точка входа в программу, обычно обозначается отличным от других классов значком):

Вообще-то в Flash Builder 4.7 в кач-ве SDK используется AIR SDK. У меня стоит версия 3.7 и вроде как мета-тэг Frame(factoryClass)] не должен работать. Об этом ещё говорилось на форуме старлинга.

KumoKairo, не помогло. До того как спрашивать я пробовал этот стандартный FD прелоадер. Кто-нибудь вообще здесь может дать нормальный работающий пример с прелоадером вместе с прогресс-баром на чистом AS3.0 без Flash IDE. Исходник прикреплен к сообщению вариант описанный KumoKairo с дополненным кодом прогресс бара.

KumoKairo 30.08.2013 16:49

Вложений: 1
Специально скачал флешбилдер посмотреть что там и как - оказалось все просто, логика правда немного другая
Вместо добавления кадра - прелоадера на Sprite - мейн класс, мы делаем сам мейн класс прелоадером - MovieClip, в который вставляем кадр с реальной точкой входа нашего приложения. После загрузки всего остального содержимого просто переходим на другой кадр, получив дефинишн по имени класса, предварительно добавив его в качестве аргумента компилятора:
Цитата:

-frame two,PseudoMain
Вложение 29955

Обращу внимание на то, что пустой проект грузится моментально, поэтому прогресс бара видно не будет. Чтобы увидеть прогресс бар, можно добавить большой файл на второй кадр и залить на хостинг.
Работоспособность подтверждает трейс процесса загрузки.
Все работает

Главное правило с прелоадерами - ни в коем случае не импортировать ненужные классы, иначе первый кадр потянет за собой все ресурсы приложения, что полностью убьет смысл прелоадера

gadzhimari 30.08.2013 17:33

Вложений: 1
KumoKairo, большое спасибо за помощь. Действительно прелоадер работает. Моей ошибкой было то, что я делал документ-классом не класс прелоадера. Только вот не мог ты посмотреть на этот прелоадер и сказать в чем может быть проблема. Т.е.

Я делаю класс Preloader документ-классом. В настройках проекта пишу -frame two Mode, но вот линии загрузки не вижу.

Код AS3:

package
{
        import org.flixel.system.FlxPreloader;
 
        [SWF(width="640", height="480", backgroundColor="#000000")]
        public class Preloader extends FlxPreloader
        {
                public function Preloader():void
                {
                        className = "Mode";
                        super();
                }
        }
}

Код AS3:

package
{
        import org.flixel.*;
 
        public class Mode extends FlxGame
        {
                public function Mode():void
                {
                        super(320,240,MenuState,2,50,50);
                        forceDebugger = true;
                }
        }
}

Вот архив

KumoKairo 30.08.2013 19:07

Слишком быстро грузится проект, условие
Код AS3:

if((framesLoaded >= totalFrames) && (time > _min))

выполнится при первом проходе по обработчику onEnterFrame

Вот закинул ту же демку на удаленный сервак (добавил в СВФ аудио файл размером 10 мб), прелоадер работает как положено
После первой загрузки флешка кешируется и сценка с прелоадером быстро проскакивает

gadzhimari 30.08.2013 19:25

Цитата:

Сообщение от KumoKairo (Сообщение 1145127)
Слишком быстро грузится проект, условие
Код AS3:

if((framesLoaded >= totalFrames) && (time > _min))

выполнится при первом проходе по первому обработчику onEnterFrame

Вот закинул ту же демку на удаленный сервак (добавил в СВФ аудио файл размером 10 мб), прелоадер работает как положено
После первой загрузки флешка кешируется и сценка с прелоадером быстро проскакивает

действительно работает. Ещё раз спасибо. Только вот один момент не понятен, почему данная swf на серваке показывает линию загрузки, а вот при тестировании в Flash IDE через Simulate Download, только белый экран.

KumoKairo 30.08.2013 19:34

Не тестируйте через флеш иде)
Сделайте фиктивную функцию загрузки для отладки. Которая, скажем, раз в 100 мс будет выкидывать "событие" загрузки очередных 15% приложения. На деле приложение, конечно, давно будет загружено, но обработчку onProgress (или onEnterFrame как в случае с Фликселем) совершенно все равно откуда брать данные для отображения.


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

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