PDA

Просмотр полной версии : Работа с Loader


DarkKnight2009
19.06.2011, 17:40
Здравсвуйте.
Подскажите пожалуйста. Есть следующий код в классе Main.as

package
{
import flash.display.*;
import flash.net.URLRequest;
import flash.events.*;
import flash.text.*;

public class Main extends Sprite
{
private var loader:Loader;
private var progressOutput:TextField;

public function Main()
{
createLoader();
createProgressIndicator();

load( new URLRequest("Module.swf") );
}

private function createLoader():void
{
loader = new Loader();

loader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, progressListener );
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeListener );
loader.contentLoaderInfo.addEventListener( Event.INIT, initListener );

loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, ioErrorListener );
}

private function createProgressIndicator():void
{
progressOutput = new TextField();
progressOutput.autoSize = TextFieldAutoSize.LEFT;
progressOutput.border = true;
progressOutput.background = true;
progressOutput.selectable = false;
progressOutput.text = "LOADING ...";
}

private function load( urlRequest:URLRequest ):void
{
loader.load(urlRequest);

if( !contains(progressOutput) )
{
addChild(progressOutput)
}
}

private function progressListener(e:ProgressEvent):void
{
progressOutput.text = "LOADING: " + Math.floor(e.bytesLoaded / 1024) + "/" + Math.floor(e.bytesTotal / 1024) + "KB";
}

private function initListener(e:Event):void
{
MovieClip(loader.content).play();
addChild(loader.content);
}

private function completeListener(e:Event):void
{
removeChild(progressOutput);
}

private function ioErrorListener(e:IOErrorEvent):void
{
progressOutput.text = "LOAD ERROR";
}

} // end class
} // end package


Этот код должен загружать аниммацию из файла Module.swf, который находится в этой же директории. Загрузка начинается, доходит до 50% ,а файл Module.swf уже загружается и начинает проигрывать, а загрузка процентов продолжает идти.
Подскажите пожалуйста в чем может быть проблема ?
Еще флеш выдает следующую ошибку:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at _964_fla::MainTimeline/frame1()

andrew911
20.06.2011, 01:09
init:Event — Передается объектом contentLoaderInfo когда становятся доступны свойства и методы загруженного SWF-файла. Событие init всегда предшествует событию complete. (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html)
Ждите complete.

DarkKnight2009
20.06.2011, 12:57
init:Event — Передается объектом contentLoaderInfo когда становятся доступны свойства и методы загруженного SWF-файла. Событие init всегда предшествует событию complete. (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/Loader.html)
Ждите complete.

Не совсем понял, мне нужно где именно запускать ролик ? В complete ? Но я там и запускааю, вот код
private function completeListener(e:Event):void
{
MovieClip(loader.content).play();
removeChild(progressOutput);
}

incvizitor
20.06.2011, 13:02
Вот эти строки:

MovieClip(loader.content).play();
addChild(loader.content);

Замените на:

MovieClip(loader.contentLoaderInfo.content).play();
addChild(loader.contentLoaderInfo.content);

И переместите в метод completeListener.

DarkKnight2009
20.06.2011, 13:05
Вот эти строки:

MovieClip(loader.content).play();
addChild(loader.content);

Замените на:

MovieClip(loader.contentLoaderInfo.content).play();
addChild(loader.contentLoaderInfo.content);

И переместите в метод completeListener.

Заменил, но все абсолютно точно так же работает, никаких изменений :(

fish_r
20.06.2011, 13:13
Вы добавляете ролик по init, это соб-тие наступает когда первый кадр доступен для проигрывания. Complete - событие когда загрузка полностью завершена. Чувствуете разницу? Поэтому у вас ролик уже проигрывается, а complete ещё нет и прогрессбар не убирается. Убирайте прогрессбар по событию init.

kackbip
20.06.2011, 13:14
Надо сделать stop MovieClip-у в initListener
А в completeListener надо сделать play

Убирайте прогрессбар по событию init.
Ненене... Прогресс бар убирать надо по событию COMPLETE и ролик на сцену тоже по событию COMPLETE надо выставлять.

ПС: Стоп в ините не забудьте сделать

DarkKnight2009
20.06.2011, 13:23
Надо сделать stop MovieClip-у в initListener
А в completeListener надо сделать play


Ненене... Прогресс бар убирать надо по событию COMPLETE и ролик на сцену тоже по событию COMPLETE надо выставлять.

ПС: Стоп в ините не забудьте сделать

Тоесть, я так понял что должен быть следующий код:
private function initListener(e:Event):void
{
addChild(loader.content);
MovieClip(loader.contentLoaderInfo.content).stop();
}

private function completeListener(e:Event):void
{
MovieClip(loader.contentLoaderInfo.content).play();
addChild(loader.contentLoaderInfo.content);
removeChild(progressOutput);
}
Тогда загружаемую анимацию нужно начинать со 2-го кадра, а 1-й кадр сделать пустым ? Чтобы картинка не появилась и стаяла на месте, а проигрывалась ровно при достижнии ЛОАДИНГА 100% , правильно ?

kackbip
20.06.2011, 13:35
Я бы так сделал:

private function initListener(e:Event):void
{
MovieClip(loader.content).stop();
}

private function completeListener(e:Event):void
{
addChild(loader.content);
MovieClip(loader.content).play();
removeChild(progressOutput);
}


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

Кстати я бы очень хотел услышать обоснование от Инквизитора,, зачем менять loader.content на loader.contentLoaderInfo.content?

DarkKnight2009
20.06.2011, 13:41
Я бы так сделал:

private function initListener(e:Event):void
{
MovieClip(loader.content).stop();
}

private function completeListener(e:Event):void
{
addChild(loader.content);
MovieClip(loader.content).play();
removeChild(progressOutput);
}


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

Кстати я бы очень хотел услышать обоснование от Инквизитора,, зачем менять loader.content на loader.contentLoaderInfo.content?

Спасибо работает !

Добавлено через 42 минуты
У меня еще вопрос
Я пытаюсь добавить к тексту размер, шрифт и т.д. Вот код
package
{
import flash.display.*;
import flash.net.URLRequest;
import flash.events.*;
import flash.text.*;
import flash.text.TextFormat;
import flash.text.Font;

public class Main extends Sprite
{
private var loader:Loader;

private var progressOutput:TextField;
private var progressOutputFormat:TextFormat;

private var load_mc:MovieClip;

public function Main()
{

createLoader();
createProgressIndicator();

load( new URLRequest("Module.swf") );
}

private function createLoader():void
{
loader = new Loader();

loader.contentLoaderInfo.addEventListener( ProgressEvent.PROGRESS, progressListener );
loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeListener );
loader.contentLoaderInfo.addEventListener( Event.INIT, initListener );

loader.contentLoaderInfo.addEventListener( IOErrorEvent.IO_ERROR, ioErrorListener );
}

private function createProgressIndicator():void
{
trace(progressOutputFormat)
progressOutputFormat.size = 18;
progressOutputFormat.color = 0x00334D;
progressOutputFormat.font = "Arial";

progressOutput = new TextField();
progressOutput.text = "LOADING ...";
progressOutput.defaultTextFormat = progressOutputFormat;

load_mc = new Load_mc();
load_mc.x = stage.stageWidth / 2;
load_mc.y = stage.stageHeight / 2;
addChild(load_mc);


}

private function load( urlRequest:URLRequest ):void
{
loader.load(urlRequest);

if( !contains(progressOutput) )
{
addChild(progressOutput)
}
}

private function progressListener(e:ProgressEvent):void
{
progressOutput.text = "LOADING: " + Math.floor(e.bytesLoaded / 1024) + "/" + Math.floor(e.bytesTotal / 1024) + "KB";
}


private function initListener(e:Event):void
{
MovieClip(loader.content).stop();
}

private function completeListener(e:Event):void
{
addChild(loader.content);
MovieClip(loader.content).play();
removeChild(progressOutput);
removeChild(load_mc);
}

private function ioErrorListener(e:IOErrorEvent):void
{
progressOutput.text = "LOAD ERROR";
}

} // end class
} // end package

В функции createProgressIndicator создаю текст
флеш ругается
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main/createProgressIndicator()
at Main()
Что не так не могу понять

andrew911
20.06.2011, 15:00
progressOutputFormat = new TextFormat();