PDA

Просмотр полной версии : Прелоадер - мгновенное появление.


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

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

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
Извините, если что))
Да нет:) Проверил на всякий случай.

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