Просмотр полной версии : Работа с 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.
Заменил, но все абсолютно точно так же работает, никаких изменений :(
Вы добавляете ролик по init, это соб-тие наступает когда первый кадр доступен для проигрывания. Complete - событие когда загрузка полностью завершена. Чувствуете разницу? Поэтому у вас ролик уже проигрывается, а complete ещё нет и прогрессбар не убирается. Убирайте прогрессбар по событию init.
Надо сделать 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% , правильно ?
Я бы так сделал:
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();
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.