Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Предзагрузчик. Нужно организовать загрузчик для самого swf файла (http://www.flasher.ru/forum/showthread.php?t=147175)

goodguy 28.11.2010 09:48

Предзагрузчик. Нужно организовать загрузчик для самого swf файла
 
Есть файл игры, в нем хранится основная графика (вид боевой техники и т.п.), файл весит около 2 мегабайт. Вся дополнительная графика (такая как деревья, вода, трава и т.п.) подгружается отдельно, и для этого организованы предзагрузчики.
Но вопрос вот в чем, а как можно организовать загрузчик для самого swf файла?
Иначе те, у кого медленный инет могут подумать, что вообще ничего не грузится

mikhailk 28.11.2010 11:16

Если приложение в разработке - можно сделать внутренний прелоадер.
Это тут было.

Если приложение уже собрано - можно сделать внешний прелоадер. Рассматриваете основной файл приложения просто как мувик и грузите его. Когда он загрузился - кидаете его на сцену и все.

goodguy 28.11.2010 11:22

Цитата:

Если приложение в разработке - можно сделать внутренний прелоадер.
Это тут было.
Вот этого не понял. Можно по-подробнее?
Что мне даст внутренний прелодер? Я то сам знаю, что все грузится. А для дополнительной графики внутренние прелодеры уже есть

expl 28.11.2010 12:16

Один из спсособов:
- Скачать FlashDevelop (даже если не в нем разрабатываете)
- Запустить
- Проект -> Новый -> создать проект "AS 3 с прелоадером"
- Посмотреть как оно это сделано

goodguy 28.11.2010 12:31

Да как делается сам прелодер я знаю. Или может я не совсем понял здесь.

Т.е. нужно создать один небольшой файл, который будет быстро загружаться сам, а потом тянуть файл игры с сервера?

ФлешДевелоп создает такой класс прелодера:
Код AS3:

package 
{
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.utils.getDefinitionByName;
 
        public class Preloader extends MovieClip
        {
 
                public function Preloader()
                {
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                        // show loader
                }
 
                private function progress(e:ProgressEvent):void
                {
                        trace(e.bytesLoaded / 1024);
                }
 
                private function checkFrame(e:Event):void
                {
                        if (currentFrame == totalFrames)
                        {
                                removeEventListener(Event.ENTER_FRAME, checkFrame);
                                startup();
                        }
                }
 
                private function startup():void
                {
                        // hide loader
                        stop();
                        loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
                        var mainClass:Class = getDefinitionByName("FunnyWar") as Class;
                        addChild(new mainClass() as DisplayObject);
                }
        }
}

Добавил туда главный класс своей игры. Всё работает, но опять же, только после того, как сам файл игры уже загрузился

romsvm 28.11.2010 14:33

а в классе FunnyWar есть такая строчка перед объявлением класса?
Код AS3:

[Frame(factoryClass="Preloader")]

более подробно тут можно почитать

Psycho Tiger 28.11.2010 14:47

Аха. Frame factory и прелоадер готов за 2 минуты.

Wolsh 28.11.2010 14:52

Давно не компилил во Флэше, но вроде там надо галочку "грузить в первый кадр" снять со всех объектов в библиотеке (кроме тех что относятся к прелоадеру конечно).

Psycho Tiger 28.11.2010 15:01

Угу, а потом во 2 кадр положить все эти объекты. Инициализировать всё в 3. Ужас. короче )

goodguy 28.11.2010 15:53

Цитата:

Сообщение от romsvm (Сообщение 953116)
а в классе FunnyWar есть такая строчка перед объявлением класса?
Код AS3:

[Frame(factoryClass="Preloader")]

более подробно тут можно почитать

Изначально не было.
Почитал эту статью, сделал загрузчик как там описано:
Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.StageAlign;
        import flash.display.StageScaleMode;
        import flash.events.Event;
        import flash.utils.getDefinitionByName;
 
        public class FDPreloader extends MovieClip
        {
                public function FDPreloader()
                {
                        stop();
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;
                        addEventListener(Event.ENTER_FRAME, enterFrame);
                }
 
                        public function enterFrame(event:Event):void
                        {
                                trace(totalFrames);
                                if(framesLoaded == totalFrames)
                                {
                                        removeEventListener(Event.ENTER_FRAME, enterFrame);
                                        nextFrame();
                                        init();
                                }
                                else
                                {
                                        var percent:Number = root.loaderInfo.bytesLoaded / root.loaderInfo.bytesTotal;
                                }
                        }
                        private function init():void
                        {
                                var mainClass:Class = Class(getDefinitionByName("FunnyWar"));
                                if(mainClass)
                                {
                                        var app:Object = new mainClass();
                                        addChild(app as DisplayObject);
                                }
                        }
                }
        }

В классе FunnyWar тоже добавил строчку:
Код AS3:

[Frame(factoryClass="FDPreloader")]
public function FunnyWar():void
{
        if (stage) initialize();
        else this.addEventListener(Event.ADDED_TO_STAGE, initialize, false, 0, true);               
}

Результат: 0.
В статье написано, что тег Frame вынуждает компилятор создать 2 кадра, в персом работает загрузчик, во втором, начинает грузиться отстальное. Как можно заметить, в коде я добавил строчку:
Код AS3:

trace(totalFrames);

Если верить этой статье, то кадров должно быть уже 2, но трейс выдает 1.
В чем подвох? :confused:

Цитата:

Давно не компилил во Флэше, но вроде там надо галочку "грузить в первый кадр" снять со всех объектов в библиотеке (кроме тех что относятся к прелоадеру конечно).
Убрал. Напрочь убивает приложение.

Цитата:

Угу, а потом во 2 кадр положить все эти объекты. Инициализировать всё в 3. Ужас. короче )
У меня в кадрах вообще ничего не инициализируется


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

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