PDA

Просмотр полной версии : ProgressEvent


stweet
30.05.2011, 05:13
package
{
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.Event;

public class Main extends Sprite
{
[Embed(source = '../bin/DSC_5350.JPG')] private var oh1:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh2:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh3:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh4:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh5:Class;

private var total :Number = 0;
private var load :Number = 0;

public function Main()
{
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
var spr4:Sprite = new Sprite();
var spr5:Sprite = new Sprite();

spr1.addChild(new oh1());
spr2.addChild(new oh2());
spr3.addChild(new oh3());
spr4.addChild(new oh4());
spr5.addChild(new oh5());

addChild(spr1);
addChild(spr2);
addChild(spr3);
addChild(spr4);
addChild(spr5);

loaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
loaderInfo.addEventListener(Event.COMPLETE, completeHandler);
loaderInfo.addEventListener(Event.INIT, initHandler);
}

private function completeHandler(e:Event):void
{
trace("completeHandler");

addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}

private function enterFrameHandler(e:Event):void
{
if (load >= total)
{
trace("complete!");

removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
return;
}
}

private function progressHandler(e:ProgressEvent):void
{
total = e.bytesTotal;
load = e.bytesLoaded;

trace("progressHandler: " + load + " / " + total);
}

private function initHandler(e:Event):void
{
trace("initHandler");
}
}
}

/* trace ==>
*
* initHandler
* progressHandler: 1969036 / 1969036
* completeHandler
* complete!
*
**/



Вся флэшка весит 20 метров и грузится 10-20 секунд а в трейсе только итог. Или я не втыкаю в суть прелоадеров или лыжи не едут.

Луди, дайте понять, как запустить приложение и увидеть этот процесс загрузки.
Читал мануал про астеройды в шапке форума не понял ни чего, нельзя описать где нить без КАДРОВ и ВРЕМЕННОЙ ШКАЛЫ?
Уже аж раздражает что моя пустая голова не может вразумить элементарного.

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

Как мне отследить процесс загрузки самого ролика?

Флекс и тот элементарный (пустой) стейдж прогрессирует что тоже заметно. Я даже пробовал создать 30 000 спрайтов 800х600, прогресса ни какого, сам плеер запускается только после того как полностью прогрузится. Ни фига не могу понять!

Заранее, очень буду БЛАГОДАРЕН за помощь!

Gaen
30.05.2011, 05:42
Без кадров, к сожалению, не обойтись.
http://etcs.ru/blog/as1/export_in_second_frame_flash_cs3/

Dukobpa3
30.05.2011, 05:45
Судя по всему мейн из флешДевелопа, так кто же помешал создать проект с прелоаедером? Там уже люди подумали за вас.

И матерился бы поменьше, выхватишь пару плюсов. Звездочки вопроса не решают ;)

package
{
import flash.display.Sprite;
import flash.events.ProgressEvent;
import flash.events.Event;

/**
* вот эта штука вставляет класс с именем Preloader
* в кадр который следует перед мейном
*/
[Frame(factoryClass="Preloader")]
public class Main extends Sprite
{
[Embed(source = '../bin/DSC_5350.JPG')] private var oh1:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh2:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh3:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh4:Class;
[Embed(source = '../bin/DSC_5350.JPG')] private var oh5:Class;

private var total :Number = 0;
private var load :Number = 0;

public function Main()
{
var spr1:Sprite = new Sprite();
var spr2:Sprite = new Sprite();
var spr3:Sprite = new Sprite();
var spr4:Sprite = new Sprite();
var spr5:Sprite = new Sprite();

spr1.addChild(new oh1());
spr2.addChild(new oh2());
spr3.addChild(new oh3());
spr4.addChild(new oh4());
spr5.addChild(new oh5());

addChild(spr1);
addChild(spr2);
addChild(spr3);
addChild(spr4);
addChild(spr5);

//Убираем листенеры отсюда
}

}
}

А вот собственно и сам прелоадер, Всё вот эти вот прогресс ивенты тут.
package
{
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.events.MouseEvent;
import flash.events.ProgressEvent;
import flash.text.TextField;
import flash.utils.getDefinitionByName;

/**
* ...
* @author Dukobpa3
*/
public class Preloader extends MovieClip
{

private var tf:TextField = new TextField();

private var pourc:int = 0;

public function Preloader()
{
if (stage) {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
}
addEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.addEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioError);

stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);

this.addChild(tf);

}

private function onMouseMove(e:MouseEvent):void
{
tf.x = mouseX + 20;
tf.y = mouseY;
}

private function ioError(e:IOErrorEvent):void
{
trace(e.text);
}

private function progress(e:ProgressEvent):void
{
// TODO update loader

pourc = e.bytesLoaded / e.bytesTotal * 100;

tf.text = pourc.toString(10);
}

private function checkFrame(e:Event):void
{
if (currentFrame == totalFrames)
{
stop();
loadingFinished();
}
}

private function loadingFinished():void
{
removeEventListener(Event.ENTER_FRAME, checkFrame);
loaderInfo.removeEventListener(ProgressEvent.PROGRESS, progress);
loaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, ioError);

startup();
}

private function startup():void
{
this.removeChild(tf);

//this.stage.addChild(new FlashPreloadProfiler());

var mainClass:Class = getDefinitionByName("MVCMain") as Class;
addChild(new mainClass() as DisplayObject);

}

}

}

stweet
30.05.2011, 06:16
Спасибо народ, извините за звёздочки, просто не мог найти более менее нормального прелоадера. Ещё раз спасибо и за пример и за толкование.

Heavy
12.07.2011, 11:09
Здравствуйте, у меня аналогичная проблема с пониманием системы работы прелоадера. Возможно потомучто никогда не программировал в кадрах и не пойму как это работает. Пишу также на FD, но пример Dukobpa3 не запустился полноценно что вызвало вопросы:
Во-первых не отобразились загруженные картинки, хотя у курсора отображается "100".
Во-вторых не понятна функция startup (маловато опыта программирования) в которой выдается ошибка "Не определена переменная "MVCMain", для меня загадка что это.
В-третих, хотелось бы уточнить где будет продолжатся сама программа после завершения загрузки, логика подсказывает что в main'е.

alatar
12.07.2011, 11:53
Возможно потомучто никогда не программировал в кадрах и не пойму как это работает.
Дело не в программировании в кадрах, а в конструкции swf и в том, как флеш-плеер с ним работает.
Во-вторых не понятна функция startup (маловато опыта программирования) в которой выдается ошибка "Не определена переменная "MVCMain", для меня загадка что это.
Вместо "MVCMain" вы должны прописать имя класса вашего "main'e".
В-третих, хотелось бы уточнить где будет продолжатся сама программа после завершения загрузки, логика подсказывает что в main'е.
Там и продолжится.

Heavy
12.07.2011, 12:34
А если походу программы нужно будет вызвать еще один прелоадер, как это нужно обозначать в Main, и нужно ли писать еще один класс дляпрелоадера или можно какимто образом воспользоваться тем же самым.

alatar
12.07.2011, 12:37
Тем же самым не получится. Но вы кажется путаете понятия прелоадера и прогрессбара.

Heavy
12.07.2011, 12:53
Судя по всему действительно путаю, и тогда не помайму, в чем смысл и плюс прелоадера, если в основном классе можно сделать прогрессбар, хотя у топикстартера это не получилось.

alatar
12.07.2011, 13:02
Прелоадер загружается и выполняется первым, до того как загружены все ресурсы. В основном классе вы можете сделать прогрессбар, но код его выполнится только после того, как загрузится вся флешка и показывать будет уже нечего.

Heavy
12.07.2011, 13:11
Тогда какой смысл прогрессбаре или как его собственно заставить работать в динамике с программой? Собственно было желание сделать прогрессбар на обработку объектов (высчитывает скажем около 1000 объектов, после чего добавляет на дисплей), во время которой программа зависает на пару секунд. В этот момент и хотелось бы чтото вроде прогресс бара.

alatar
12.07.2011, 13:26
И? В чем проблема? Прогрессбар это просто отображение процесса, на важно загрузка объектов это или выполнение каких-то действий.

Heavy
12.07.2011, 13:40
Спасибо за растолкование, буду пробывать

Добавлено через 1 час 24 минуты
Рассматриваемый прелоадер из 3 поста этой темы захватывает все события происходящие от его вызова
[Frame(factoryClass="Preloader")]
и до функции указаной в прелоадере как "mainMVC"?

Dukobpa3
12.07.2011, 15:08
Рассматриваемый прелоадер из третьего поста просто становится в кадр который идет перед мейном. Следовательно весь код в нем выполняется до того как мейн будет загружен.

Heavy
12.07.2011, 15:21
Тогда спрошу от обратного. Запустится ли функция Мейн, если объем данных еще не загрузился, потому что до этого у меня были листенеры которые сообщали о загрузке и только тогда запускали мейн...

alatar
12.07.2011, 15:27
Какая "функция Мейн"? Конструктор класса Main? Нет не запустится, он еще не загрузился на этапе выполнения прелоадера. Более того, если его принудительно не создать, он вообще не запустится никогда.

Heavy
12.07.2011, 15:32
Извините, но что в данном случае есть "принудительно" :
var mainClass:Class = getDefinitionByName("Main") as Class;
addChild(new mainClass() as DisplayObject);
или
public function Main()

alatar
12.07.2011, 15:50
первое

Heavy
12.07.2011, 20:22
Перерыл форум за последний год с темами про такую же модель прелоадера, но везде в примерах указано что они грузят картинку [Embed(source = '../lib/f1.jpg')] private var oh1:Class; и не понятно как можно произвести загрузку при помощи URLLoader
var loader:URLLoader = new URLLoader;
loader.load(new URLRequest("1234.txt"));

Dukobpa3
13.07.2011, 02:13
Картинку они грузят просто чтоб чем-то нагрузить флешку чтобы добавить веса. Можно на нее не обращать внимания.

Короче суть флеша и прелоадера во флеше в следующем:

1. Есть флешка.
2. Флешка состоит из кадров и кода
3. А теперь надо понимать следующую штуку: флешка начинает проигрывать следующий кадр как только он уже загружен. Собственно поэтому прелоадеры делают легкими и пихают их в первый кадр. Так как даже если вся флешка будет 10мб весить, а прелоадер (т.е. первый кадр) будет весить 30кб - то этот первый кадр начнет проигрываться автоматом сразу после его загрузки, не дожидаясь загрузки основной флешки.
4. И теперь еще один момент. Так как мы пишем не на таймлайне (т.е. в кадрах), а кодом - то допустим флешка среднестатистического пользователя флешер.ру будет состоять всего из одного кадра если без прелоадера, и из двух если с прелоадером. Так как плевали мы на таймлайн.
5. Но то что мы куда-то там плевали адобов не особо парит. Флешка все-равно играется по кадрам и то что я написал в третьем пункте все-равно работает. И чтоб как-то уладить это наплевательство разработчики флекса запилили такую вот штуку как: [Frame(factoryClass="Preloader")] которая вставляет кадр с указанным контентом там где стоит данный метатег. В данном случае перед инициализацией класса Main.

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

Флешплеер грузит флешку по порядку. По кадрам. Сначала первый. Прелоадер. Хоп - он загрузился, начал выполняться. Потом грузит остальную флешку. Но тут еще одна мулька:
Второй кадр у нас содержит только код, это не какой-то там графический контент на таймлайне. Это просто класс. И вот этот код сам по себе исполняться не начнет. Его надо как-то заставить запуститься.

И вот здесь нам пригодится конструкция:
var mainClass:Class = getDefinitionByName("Main") as Class;
addChild(new mainClass() as DisplayObject);

Поидее может возникнуть вопрос: "а почему не просто: "addChild(new Main())""
Но на него мы ответим так:
Если мы импортируем мейн в прелоадер тогда в задницу все наши танцы с бубном вокруг двух кадров. Так как мейн будет грузиться сразу же в первом кадре, так как на него будет стоять в нем ссылка.
Поэтому мы грузим безымянную неведомую х**ню. (Это с точки зрения флеша она безымянная-неведомая, но мы таки знаем как ее зовут). А потом уже инициализируем эту неведомую муть вот такой вот штукой как гетДефинишн. Ведь как только флешка загрузилась все ее классы стали доступны в некой коробочке в которой лежат все классы. И мы по имени класса из этой коробочки его достаем и инициализируем.

З.Ы. А к чему тут урллоадер я так и не понял...

Heavy
13.07.2011, 12:38
Благодарю за такой развернутый ответ, очень полезно узнать чтото о том как это работает.
Значит Прелоадер отображает загрузку только самой откомпилированной программы и "вшитых" при помощи тега Embed? Тогда подскажите при помощи каких тегов загружать допустим другую SWF? или все остальные компоненты, которые не грузятся сразу, нужно подгружать уже внутренними средствами класса и там же организовывать прогресс бар?

alatar
13.07.2011, 12:59
Ндаа...
Loader (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html), URLLoader (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/URLLoader.html), NetStream (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/net/NetStream.html), Sound (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/media/Sound.html)

Добавлено через 36 секунд
Примеры там же. Кроме форума, есть много полезной литературы, которую стоит почитать.