Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 19.06.2011, 17:40
DarkKnight2009 вне форума Посмотреть профиль Отправить личное сообщение для DarkKnight2009 Найти все сообщения от DarkKnight2009
  № 1  
Ответить с цитированием
DarkKnight2009

Регистрация: May 2009
Сообщений: 122
По умолчанию Работа с 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()

Старый 20.06.2011, 12:57
DarkKnight2009 вне форума Посмотреть профиль Отправить личное сообщение для DarkKnight2009 Найти все сообщения от DarkKnight2009
  № 3  
Ответить с цитированием
DarkKnight2009

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

Старый 20.06.2011, 13:02
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 4  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Вот эти строки:
Код AS3:
MovieClip(loader.content).play();
addChild(loader.content);
Замените на:
Код AS3:
MovieClip(loader.contentLoaderInfo.content).play();
addChild(loader.contentLoaderInfo.content);
И переместите в метод completeListener.
__________________
ranga

Старый 20.06.2011, 13:05
DarkKnight2009 вне форума Посмотреть профиль Отправить личное сообщение для DarkKnight2009 Найти все сообщения от DarkKnight2009
  № 5  
Ответить с цитированием
DarkKnight2009

Регистрация: May 2009
Сообщений: 122
Цитата:
Сообщение от incvizitor Посмотреть сообщение
Вот эти строки:
Код AS3:
MovieClip(loader.content).play();
addChild(loader.content);
Замените на:
Код AS3:
MovieClip(loader.contentLoaderInfo.content).play();
addChild(loader.contentLoaderInfo.content);
И переместите в метод completeListener.
Заменил, но все абсолютно точно так же работает, никаких изменений

Старый 20.06.2011, 13:13
fish_r вне форума Посмотреть профиль Отправить личное сообщение для fish_r Посетить домашнюю страницу fish_r Найти все сообщения от fish_r
  № 6  
Ответить с цитированием
fish_r
 
Аватар для fish_r

блогер
Регистрация: Jan 2011
Сообщений: 1,162
Записей в блоге: 4
Вы добавляете ролик по init, это соб-тие наступает когда первый кадр доступен для проигрывания. Complete - событие когда загрузка полностью завершена. Чувствуете разницу? Поэтому у вас ролик уже проигрывается, а complete ещё нет и прогрессбар не убирается. Убирайте прогрессбар по событию init.

Старый 20.06.2011, 13:14
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 7  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Надо сделать stop MovieClip-у в initListener
А в completeListener надо сделать play

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

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

Старый 20.06.2011, 13:23
DarkKnight2009 вне форума Посмотреть профиль Отправить личное сообщение для DarkKnight2009 Найти все сообщения от DarkKnight2009
  № 8  
Ответить с цитированием
DarkKnight2009

Регистрация: May 2009
Сообщений: 122
Цитата:
Сообщение от kackbip Посмотреть сообщение
Надо сделать 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% , правильно ?

Старый 20.06.2011, 13:35
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 9  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Я бы так сделал:
Код 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?

Старый 20.06.2011, 13:41
DarkKnight2009 вне форума Посмотреть профиль Отправить личное сообщение для DarkKnight2009 Найти все сообщения от DarkKnight2009
  № 10  
Ответить с цитированием
DarkKnight2009

Регистрация: May 2009
Сообщений: 122
Цитата:
Сообщение от kackbip Посмотреть сообщение
Я бы так сделал:
Код 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()
Что не так не могу понять

Создать новую тему Ответ Часовой пояс GMT +4, время: 11:03.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Теги
loader as3 , PROGRESS , ProgressBar , ProgressEvent

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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