Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Прелоадер - мгновенное появление. (http://www.flasher.ru/forum/showthread.php?t=171660)

Astraport 21.11.2011 15:59

Прелоадер - мгновенное появление.
 
Создаю pure AS3 проект. На выходе флэшка всего 450 кБ. Сначала делал вообще без прелоадера. Но при открытии в браузере флэшка появляется только на 4-5 секунде. Непонятно от чего это.
Решил добавить прелоадер. В флэшке из 450 кБ - 3/4 это ресурсы: графика (jpg, png, swf) и звуки (mp3).

Читаю здесь как правильно добавлять прелоадер.
Теперь у меня в корне проекта появляются три класса: Main, Preloader и App.
Почти все как в статье по ссылке (вторая часть где без Flash IDE) только добавил SWF которая отображает процесс загрузки цифрами. Вот сам класс Preloader.as

Код AS3:

package 
{
        import flash.display.BlendMode;
        import flash.display.DisplayObject;
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.text.TextField;
        import flash.utils.getDefinitionByName;
        import flash.events.ProgressEvent;
 
        [SWF(width="500", height="700", frameRate="30")]
        public class Preloader extends MovieClip
        {
                [Embed(source = 'lib/preloader.swf', symbol = 'progressbar')]
                private var progressBarClass:Class
                [Embed(source = 'lib/preloader.swf', symbol = 'percent')]
                private var percentDisplayClass:Class
 
                private var preloadGraphic:Sprite = new Sprite();
                private var progressBar:Sprite = new progressBarClass();
                private var percentDisplay:Sprite = new percentDisplayClass();
                private var percent:TextField;
                [Embed(source="images/afisha_4.png")]
                public var Afisha:Class;
                public function Preloader()
                {
                        addEventListener(Event.ENTER_FRAME, checkFrame);
                        // show loader
                        progressBar.scaleX = 0;
                        preloadGraphic.addChild(progressBar);
                        preloadGraphic.addChild(percentDisplay);
                        preloadGraphic.y = stage.stageHeight / 2;
                        percentDisplay.blendMode = BlendMode.INVERT;
                        percentDisplay.x = stage.stageWidth / 2;
                        percentDisplay.y = -4;
                        percent = percentDisplay.getChildByName("percentDisplay") as TextField;
                        addChild(preloadGraphic);
                        loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
                }
 
                protected function progress(event:ProgressEvent):void
                {
                        trace(event.bytesLoaded);
                }
 
                private function checkFrame(e:Event):void
                {
                        trace(e);
                        if (currentFrame == totalFrames)
                        {
                                removeEventListener(Event.ENTER_FRAME, checkFrame);
                                startup();
                        } else {
                                var bytesLoaded:Number = this.loaderInfo.bytesLoaded;
                                var bytesTotal:Number = this.loaderInfo.bytesTotal;
                                percent.text = Math.ceil((100 * (bytesLoaded / bytesTotal))) + "%";
                                progressBar.scaleX = (bytesLoaded / bytesTotal);
                        }
                }
 
                private function startup():void
                {
                        removeChild(preloadGraphic);
                        stop();
                        var mainClass:Class = getDefinitionByName("Main") as Class;
                        addChild(new mainClass() as DisplayObject);
                }
        }
}

В Main прописал [Frame(factoryClass="Preloader")]
Теперь при запуске прелоадер с 100% появляется на доли секунды и пропадает. Специально заэмбедил в проект png размером 27 Мб, но все равно грузится мгновенно. При этом первый трейс выдает 11447351, а второй вообще ничего (извиняюсь, не досмотрел - выводит [Event type="enterFrame" bubbles=false cancelable=false eventPhase=2]).

Подскажите, как все правильно вставить прелоадер, чтобы он нормально отображал загрузку моих ресурсов?
Правильно ли что все ресурсы нужно добавлять так как я сделал с png или можно создать отдельный файл, а в прелоадере просто импортнуть: import myRes.Resourses;?

tofflife 21.11.2011 18:07

Вероятно, вы проверяете загрузку локально. Загрузка локально осуществляется одним пакетом.
Ещё возмонжо причины присутствия галочек в ресурсах типа "export in first frame".

если вы разрабатываете флешку под flash AS3.0 то в режиме отладки в менюшке можно найти пункт Download simulation.

p.s. не забывайте указывать версию ОС, версию отладчика и среду.

Astraport 21.11.2011 18:18

tofflife, спасибо, но причина была не в этом. На удаленном сервере тоже не работало.
Почему-то вывод по ENTER_FRAME не работал как в примере выше, в PROGRESS работает, но тоже как-то странно - progressBar.scaleX отлично и равномерно работает, а вот цифирки Math.ceil(100 * (bytesLoaded / bytesTotal)) в процессе загрузки выводят 0 или изредка 1 и потом в конце сразу 100%

fish_r 21.11.2011 19:28

Я вижу, что слушается вход в кадр, но не вижу инстр. addFrame, срабатывает условие currentFrame === totalFrame ?

Wolsh 21.11.2011 20:00

Цитата:

Почему-то вывод по ENTER_FRAME не работал как в примере выше, в PROGRESS работает
Ну так еще бы)) Когда вызовется ENTER_FRAME – загрузка уже закончилась и начинается отрисовка следующего кадра, то есть главного, в котором Мейн и все прибамбасы. На этом прелоадер и построен. Слушать надо прогресс. Если беда с цифрами, то надо разбираться с цифрами, я лично подозреваю, что Вы просто повесили на прогресс изменение скейла, а цифры так и остались на ентерфрейм по невнимательности. Извините, если что))

Astraport 21.11.2011 20:21

Цитата:

Извините, если что))
Да нет:) Проверил на всякий случай.
Код AS3:

tbite = this.loaderInfo.bytesTotal;
protected function progress(event:ProgressEvent):void
                {
                        percent.text = String (Math.ceil(100 * (event.bytesLoaded / tbite))) + "%";
                        progressBar.scaleX = event.bytesLoaded / tbite;
                }



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

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