Форум 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. Ужас. короче )
У меня в кадрах вообще ничего не инициализируется

iNils 28.11.2010 15:55

http://www.flasher.ru/forum/showthread.php?t=122720

goodguy 28.11.2010 16:18

Увы, не мой случай.
Чтобы ситуация была всем ясна, вот как у меня все построено:

Есть .fla файл, в библиотеке которого хранится куча объектов.
На таймлайне в этом файле вообще ничего не инициализируется. Т.е. есть один слой, на котором один пустой кадр, всё. В качестве класса документа в данный момент к нему прикручен класс FunnyWar.

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

Загрузчик из флеш девелоп (как я уже говорил выше) работает, но так же после загрузки файла целиком.


Похоже единственное решение - это сделать еще один файл, который и будет грузить с сервера основной

expl 28.11.2010 17:45

Цитата:

Загрузчик из флеш девелоп (как я уже говорил выше) работает, но так же после загрузки файла целиком.
может старая версия - там они специальный параметр компиляции прописывали, чтобы основной класс вкомпиливался во-второй кадр

Цитата:

Есть .fla файл, в библиотеке которого хранится куча объектов.
Если компилируете не mxmlс, a Flash IDE то, конечно, Вы его не пропишите.

Цитата:

Делать 2 кадра бессмысленно, так как все равно будет грузиться весь файл, не зависимо от того вызвать конструктор FunnyWar в первом или во втором кадре.
Кто Вам такое сказал? Всё зависит от того, стоит ли галочка "встроить в первый кадр" в linkage-свойствах символа (про Flash IDE)

goodguy 28.11.2010 18:09

Цитата:

Кто Вам такое сказал? Всё зависит от того, стоит ли галочка "встроить в первый кадр" в linkage-свойствах символа (про Flash IDE)
Почему мне кто-то должен был это сказать? Я это сам проверял. Не работает.

Цитата:

может старая версия - там они специальный параметр компиляции прописывали, чтобы основной класс вкомпиливался во-второй кадр
Версия самая новая.

Код AS3:

Если компилируете не mxmlс, a Flash IDE то, конечно, Вы его не пропишите.

Кончено во Flash IDE, я уже несколько раз об этом написал в теме.

Wolsh 28.11.2010 18:51

Цитата:

Я это сам проверял. Не работает.
Вы делали ДВА кадра?
Мне вообще непонятно, зачем вы пытаетесь использовать класс прелоадера от ФД во Флэш ИДЕ. Совершенно разные компиляторы, совершенно разные способы работы с библиотекой. Во Флэш ИДЕ вам надо физически создать 2 кадра на таймлайне, убрать те самые галки, которые "не работают", в первом кадре отобразить прелоадер, во втором инициализировать FunnyWar. Прелоадер должен показывать все что ему надо и переводить приложение на следующий кадр после полной загрузки. Как всегда и делалось во Флэше. В ФД нет таймлайна, на котором можно так все раскидать, поэтому у него такой специальный прелоадер заботливо добавлен в шаблоны. Во Флэше-то он зачем? Вся его задача - сымитировать эти "два кадра на таймлайне".

mikhailk 28.11.2010 18:55

goodguy, cделайте внешний загрузчик, если это будет проще
никто этого не заметит

код, конечно, могу выложить, но там все очевидно.
главное - не забыть контекст загрузки прописать


ЗЫ. А, вообще-то, завязывайте с компиляцией во FlashIDE. :)

goodguy 28.11.2010 18:56

Цитата:

Вы делали ДВА кадра?
Да. Начинает работать, только после полной загрузки файла.
Делал первый кадр, вызывал в нем метод stop(); и вставлял код загрузчика. После того как загрузчик завершал загрузку, вызывал nextFrame(); Во втором кадре уже:
Код AS3:

var fw:FunnyWar = new FunnyWar(); 
stage.addChild(fw);

не пашет. Честно говоря, сам не понимаю почему. Делал сайты с подобной конструкцией, и все работало

Цитата:

goodguy, cделайте внешний загрузчик, если это будет проще
никто этого не заметит

код, конечно, могу выложить, но там все очевидно.
главное - не забыть контекст загрузки прописать
Думаю надо бы... похоже правда иначе никак.

Цитата:

ЗЫ. А, вообще-то, завязывайте с компиляцией во FlashIDE
Дело в том, что этот проект я начал еще 5 месяцев назад, тогда еще особо не соображал, как можно обходиться без флешки. За это время многому научился, но переделывать проект уже сродни созданию его с нуля. Так что этот в любом случае надо доделывать во Flash IDE

Добавлено через 37 минут
Вопрос исчерпан. Сделал все-таки внешний загрузчик:

Код AS3:

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;
 
loadMovie();
 
function loadMovie()
{
        var loader:Loader = new Loader();
        var request:URLRequest = new URLRequest("NewWar_beta.swf");
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
        loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, updatePreloader);
        loader.load(request);
}
function updatePreloader(e:ProgressEvent)
{
        var percent:Number = e.bytesLoaded / e.bytesTotal;
        trace(percent);
}
function loadCompleteHandler(loadEvent:Event)
{
        addChild(loadEvent.currentTarget.content);
}

Работает как часы. Всем спасибо :) Тему можно закрывать.

mikhailk 28.11.2010 21:54

на сайт уже выкладывали?
не будет работать
по крайней мере не должно

goodguy 28.11.2010 21:55

Не выкладывал.

Цитата:

не будет работать
по крайней мере не должно
Почему?

Путь к файлу то я потом поменяю, и кросдоменную политику добавлю. Или дело не в этом?

Achiles 28.11.2010 21:57

Пишу на AS3 совсем недавно. Нужен совет по загрузчику.
Пытался сделать как в предыдущем посте (внешний).
Трейсится процент загрузки нормально, но после 100% сразу выскакивает ошибка:

Код:

VerifyError: Error #1014: Class с_human could not be found.
Этот класс у меня линкуется в библиотеке главной флешки, которую я хочу подгрузить.
Может что-то с загрузчиком намудрил?

Главная флешка сама по себе компилится и работает нормально.

mikhailk 28.11.2010 22:37

Цитата:

Путь к файлу то я потом поменяю, и кросдоменную политику добавлю. Или дело не в этом?
Контекст загрузки нужен. Иначе будет ошибка безопасности. Я о контексте выше писал.

Например, я вот так определяю контекст:

Код AS3:

Security.allowDomain("*"); 
var context:LoaderContext = new LoaderContext(true, ApplicationDomain.currentDomain);
var domain:String = new LocalConnection().domain;
if (domain!="localhost") context.securityDomain = SecurityDomain.currentDomain;
 
loader.load(request, context);


goodguy 28.11.2010 22:41

О как, не знал, не знал.. Спасибо за подсказку

mikhailk 28.11.2010 23:03

В ряде случаев можно обходиться более простой конструкцией:

Код AS3:

loader.load(request, new LoaderContext(true));

Но, вообще, лучше почитать про LoaderContext и модель безопасности флеша.

http://help.adobe.com/ru_RU/AS3LCR/F...erContext.html

goodguy 05.12.2010 21:56

Не пашет :(
Причем и контекст загрузки делал, и кроссдоменник на сервер заливал, все бестолку. Файл качается, доходит до 100% и вместо добавления его на сцену, выдает ошибку 2121.
Сколько не гуглил, все время нахожу рекомендации сделать так: Security.allowDomain("нужный домен/ или *");
Это работает для каких-нибудь картинок, но не для swf файлов.
Уже и не знаю куда копать...

А если залить в контакт, то вместо отображения процентов загрузки, вообще выдает слово Infinity. И на этом, естественно, все останавливается.

Добавлено через 25 минут
Такс.. первая проблема решена.
Если у кого-то возникнет подобная проблема, то нужно добавить строчку Security.allowDomain("домен"); не только в файл который згружает другой swf, но и в главный класс загружаемого swf.

А вот с контактом понять пока не могу..

Добавлено через 54 минуты
вывод информации о загрузке показывает, что он не может получить величину загружаемого файла.

Строчка
Код AS3:

e.bytesTotal;

Выдает ноль, отсюда
Код AS3:

e.bytesLoaded / e.bytesTotal

Приводит к результату Infinity.

Кто знает как исправить?

п.с. Никаких ошибок не выдает при загрузке, просто не грузит и все. Везде располагал блоки try / catch
все время нормально срабатывают блоки try

mikhailk 06.12.2010 00:25

Вопросы по ВК лучше задать в группе API VK, там могут помочь.
А если поставить загрузчик не в ВК, а просто на обычный сайт - загрузка нормально проходит?

goodguy 06.12.2010 11:50

Вот теперь я точно в ступоре. На работе, где статичный айпи и скоростной инет, нормально грузится все. Дома на динамическом ip и не очень хорошем инете не работает :(
Значит дело даже не во флешке.

А кто знает, есть ли какое-то определенное время ожидания ответа от сервера после которого флеш плеер закрывает соединение?
Может это из-за того, что у меня инет всего мегабитный?

Если есть, можно ли это значение как-то поменять?

Все происходит так: подключается, несколько секунд (примерно 5 - 7) показывает 0%, а потом Infinity. Если это не ограничение по времени соединения, то что это вообще может быть...
Хотя пинг у сервера, на который залил файлы всего 63 - 65 миллисекунд. Думаю, очень даже неплохой.

Цитата:

А если поставить загрузчик не в ВК, а просто на обычный сайт - загрузка нормально проходит?
Дома нет. Т.е. точно так же как в контакте.

den01101 29.08.2011 20:06

Создал новый .fla, в пером кадре написал ему код
Код AS1/AS2:

import flash.net.URLRequest;
import flash.display.Loader;
import flash.events.Event;
import flash.events.ProgressEvent;
 
loadMovie();
 
function loadMovie()
{
        var loader:Loader = new Loader();
        var request:URLRequest = new URLRequest("main.swf");
        //loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadCompleteHandler);
        //loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, updatePreloader);
        loader.load(request);
}
function updatePreloader(e:ProgressEvent)
{
        var percent:Number = e.bytesLoaded / e.bytesTotal;
        trace(percent);
}
function loadCompleteHandler(loadEvent:Event)
{
        trace("complite");
        addChild(loadEvent.currentTarget.content);
}

в итоге:
PHP код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
    
at Main() 

Что я не так сделал?

goodguy 29.08.2011 20:36

Цитата:

Что я не так сделал?
Проблема в подгружаемой swf. В этом коде внешне все нормально


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

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