Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Работа с Loader (http://www.flasher.ru/forum/showthread.php?t=158412)

DarkKnight2009 19.06.2011 17:40

Работа с Loader
 
Здравсвуйте.
Подскажите пожалуйста. Есть следующий код в классе Main.as
Код AS3:

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.
Ждите complete.

DarkKnight2009 20.06.2011 12:57

Не совсем понял, мне нужно где именно запускать ролик ? В complete ? Но я там и запускааю, вот код
Код AS3:

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


incvizitor 20.06.2011 13:02

Вот эти строки:
Код AS3:

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

Замените на:
Код AS3:

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

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

DarkKnight2009 20.06.2011 13:05

Цитата:

Сообщение от incvizitor (Сообщение 1004998)
Вот эти строки:
Код AS3:

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

Замените на:
Код AS3:

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

Цитата:

Сообщение от kackbip (Сообщение 1005004)
Надо сделать stop MovieClip-у в initListener
А в completeListener надо сделать play


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

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

Тоесть, я так понял что должен быть следующий код:
Код AS3:

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

Я бы так сделал:
Код AS3:

                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

Цитата:

Сообщение от kackbip (Сообщение 1005009)
Я бы так сделал:
Код AS3:

                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 минуты
У меня еще вопрос
Я пытаюсь добавить к тексту размер, шрифт и т.д. Вот код
Код AS3:

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

Код AS3:

progressOutputFormat = new TextFormat();



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

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