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

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

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

Регистрация: Jun 2006
Сообщений: 55
По умолчанию Управление временной шкалой embedded мувиклипа

Прошу помочь решить такую задачу. Необходимо создать swf-файл с анимацией, интегрировать его в основной проект и средствами основного проекта управлять анимацией. Например, в зависимости от значения определенной переменной показывать только кадры анимации с 1 по 5, или только с 6 по 10.

Делаю так. В файле animate.fla на основной временной шкале 10 кадров анимации. В publish settings этого файла указываю Document Class — MyClass.

В файле MyClass.as создаю конструктор, который ничего не делает кроме вывода сообщения:
Код AS3:
trace("MyClass.as loaded");
В основном проекте интегрирую animate.swf таким образом:

Код AS3:
[Embed(source="path/to/animate.swf")]
private var MyAnimation: Class;
 
private var myanim: MovieClipLoaderAsset;
 
private function init(): void {			
	myanim = new MyAnimation();
 
	this.addChild(myanim);
 
	myanim.addEventListener(MouseEvent.CLICK, myanimClickListener);
}
После всех этих действий моя анимация без проблем выводится на экране, при этом последовательно зацикленно показываются все 10 кадров анимации. Кроме того корректно срабатывает конструктор из файла animate.swf (в консоль выводится заданный мною в конструкторе текст "MyClass.as loaded"), но при этом я никаким образом не могу повлиять на управление анимацией. Методы myanim.stop(), myanim.gotoAndPlay(5); не срабатывают. myanim.currentFrame всегда возвращает 0.

Как заэмбидить эсвээфку так, чтобы можно было программно управлять анимацией?

Старый 21.06.2009, 22:36
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 2  
Ответить с цитированием
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
>>Как заэмбидить эсвээфку так, чтобы можно было программно управлять анимацией?

Код AS3:
package  
{
	import flash.display.*
	import flash.events.*;
	import flash.text.*;
	import flash.ui.*;
	import flash.system.*;
	import flash.net.*;
	import flash.utils.*;
 
	/**
	 * ...
	 * @author http://www.murmadillo.tut.su/
	 */
	public class DogLoad extends Sprite
	{
 
		[Bindable]
		[Embed(source = "Untitled-2.swf", mimeType='application/octet-stream')]
		private var swfByte:Class,
		loader:Loader,
		swfObj:Object,
		startStop:Boolean;
 
 
		public function DogLoad() 
		{
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoadComplete);
			loader.loadBytes(new swfByte,new LoaderContext(false, ApplicationDomain.currentDomain));
		}
 
		private function onLoadComplete(evt:Event):void {
			loader.removeEventListener(Event.COMPLETE, onLoadComplete);
			addChild(loader.content);
			swfObj = loader.content;
			stage.addEventListener(MouseEvent.CLICK, stageClickHandler);
		}
 
		private function stageClickHandler(evt:MouseEvent):void {
			if (startStop) startStop = false; else startStop = true;
			if (startStop) swfObj.stop(); else swfObj.play();
			trace(startStop);
		}
	}
 
}

Старый 21.06.2009, 23:20
Огнеметчик вне форума Посмотреть профиль Отправить личное сообщение для Огнеметчик Найти все сообщения от Огнеметчик
  № 3  
Ответить с цитированием
Огнеметчик

Регистрация: Jun 2006
Сообщений: 55
Спасибо за код, сейчас его испытаю. Ты не мог бы прокомментировать, для чего нужен loader? Зачем загружать объект, если он итак интегрирован в swf? Это не очень ресурсоемкая/долговременная операция?

Старый 21.06.2009, 23:43
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 4  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
если ембедить как флешку, то тоже можно добраться, только там основная линейка загруженного ролика тоже оказывается в лоадере, который в свою очередь еще в какой-то обертке (не вникал в детали)
Код AS3:
public class Main extends Sprite 
{
	[Embed(source="animate.swf")]
	private var MyAnimation: Class;
	private var myanim:*;
 
	public function Main():void 
	{
		myanim = new MyAnimation();
		myanim.addEventListener(MouseEvent.CLICK, myanimClickListener);
		this.addChild(myanim);
	}
 
	private function myanimClickListener(evnt:Event):void 
	{
		var myanimContent:MovieClip = myanim.getChildAt(0).content;
		myanimContent.stop();
		trace( "myanimContent : " + myanimContent );//[object MyClass]
	}
 
}

Старый 22.06.2009, 01:37
Огнеметчик вне форума Посмотреть профиль Отправить личное сообщение для Огнеметчик Найти все сообщения от Огнеметчик
  № 5  
Ответить с цитированием
Огнеметчик

Регистрация: Jun 2006
Сообщений: 55
Alex Lexcuk и silin спасибо за ответы, изучил оба ваших варианта, оба они рабочие, но могу никак их прикрутить к своей программе.

Прошу помочь разобраться с проблемой. Боюсь что у меня концептуально неправильный подход к загрузке объектов. Хотелось бы узнать правильно я подхожу к разработке программы или нет.

Основной модуль программы я пишу во Flex Builder 3 и я рассчитывал создать несколько анимашек во Flash IDE, заэмбидить из в основное приложение и нужным мне образом в нужное время выводить нужные кадры анимации. Может быть я поступаю неправильно и есть какой-то более грамотный способ организации приложения?

==========

По поводу проблем, которые возникли у меня с приведенными выше примерами.

При использовании первого варианта возникает такая проблема. У меня подряд идут две строки:
Код AS3:
myanim = new MyAnimation();
this.addChild(myanim);
После выполнения первой строки, запускается загрузка объекта по методу, который предложил Alex Lexcuk, но при этом строка this.addChild(myanim); выполняется не дожидаясь загрузки нужной мне swf-ки, таким образом, объект на экране появляется, но взаимодействовать с ним все равно нельзя. Но вот если я сначала выполню строчку
Код AS3:
myanim = new MyAnimation();
, потом подожду некоторое время и выполню строчку
Код AS3:
this.addChild(myanim);
(я для теста вешал вторую строку на событие клик по любому месту экрана), то анимация корректно отображается и может изменяться моим кодом...

В общем, для работоспособности этого примера, нужно дождаться полной загрузки эсвээфки перед добавлением ее в список отображения... Как этого добиться? Генерировать свое событие на онКомлпит загрузки и добавлять мувик в список отображения при возникновении этого события? Или может есть решение попроще?

============

По поводу варианта silin. Мне он кажется наиболее простым и изящным. Честно говоря, я не ожидал что с моей задачей будет столько проблем, казалось примерно так просто она и должна решаться: загрузил мувик и крути его программным способом как душе угодно... но и с этим вариантом возникла непонятная проблема. В том виде, в которым решение тут приведено программа работает, но мне нужно чтобы мувик управлялся без взаимодействия с пользователем, то есть мне нужно избавиться от действий, которые в примере повешены на событие Клик. По этому я модифицировал код так:
Код AS3:
public class Main extends Sprite 
{
	[Embed(source="animate.swf")]
	private var MyAnimation: Class;
	private var myanim:*;
 
	public function Main():void 
	{
		myanim = new MyAnimation();
		myanim.addEventListener(MouseEvent.CLICK, myanimClickListener);
		this.addChild(myanim);
 
		var myanimContent:MovieClip = myanim.getChildAt(0).content;
		myanimContent.stop();
		trace( "myanimContent : " + myanimContent );//[object MyClass]
	}
}
и он перестал работать. Удивительно, не пойму какая разница выполняю я последние три строки кода сразу, или после клика, но в приведенном мною варианте код не работает.

Старый 22.06.2009, 08:32
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 6  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Адоби спецы по извращениям
Код AS3:
public class Main extends Sprite {
 
	[Embed(source="animate.swf")]
	private var MyAnimation: Class;
	private var myanim:*;
 
	public function Main():void {
		myanim = new MyAnimation();
		(myanim.getChildAt(0) as Loader).contentLoaderInfo.addEventListener(Event.COMPLETE, myanimLoadListener);
		this.addChild(myanim);
	}
 
	private function myanimLoadListener(evnt:Event):void 
	{
		var myanimContent:MovieClip = myanim.getChildAt(0).content;
		myanimContent.stop();
		trace( "myanimContent : " + myanimContent );//[object MyClass]
	}
 
}
Добавлено через 40 секунд
Там по идее всего один кадр подождать то нужно
__________________
TankiOnline
Я разработчик Alternativa3D

Старый 22.06.2009, 09:19
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 7  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
>>Удивительно, не пойму какая разница выполняю я последние три строки кода сразу, или после клика
разница в том, что нужно время, чтобы загрузить контент в лоадер,
вроде бы достаточно одного кадра, но как Яски показал надежнее

Старый 22.06.2009, 12:31
Огнеметчик вне форума Посмотреть профиль Отправить личное сообщение для Огнеметчик Найти все сообщения от Огнеметчик
  № 8  
Ответить с цитированием
Огнеметчик

Регистрация: Jun 2006
Сообщений: 55
К сожалению, вариант предложенный Яски не работает. Выдается сообщение об ошибке:
Код:
RangeError: Error #2006: Предоставленный индекс выходит за допустимые пределы.
	at flash.display::DisplayObjectContainer/getChildAt()
	at Embed_test()[C:\doc_root\FLASH\embed_test\project\src\Embed_test.as:18]
где 18 строка это:
Код AS3:
(myanim.getChildAt(0) as Loader).contentLoaderInfo.addEventListener(Event.COMPLETE, myanimLoadListener);
Похоже это от того, что я пытаюсь обратиться к myanim.getChildAt(0) еще до возникновения события INIT, правильно? Как бы обойти эту проблему?

Добавлено через 33 минуты
О! Ура! Разобрался!

Есть файл Myanimation.fla с 10 кадрами, у него в качестве Document Class указан файл Myanimation.as с таким содержимым:
Код AS3:
package {
	import flash.display.MovieClip;
 
	public class Myanimation extends MovieClip {
 
		public var live: Boolean = true;
 
		public function Myanimation(){
			trace("Myanimation.as loaded");
		}
 
		public function test(): void {
			trace("inner method test");
		}
	}
}
Основное приложение Embed_test.as:
Код AS3:
package {
	import flash.display.*;
	import flash.events.*;
 
	//import mx.core.MovieClipLoaderAsset;
 
	public class Embed_test extends Sprite
	{
		[Embed(source="Myanimation.swf", mimeType="application/octet-stream")]
		private var MyClass: Class;
 
		//private var myanim: ByteArrayAsset;
		private var loader: Loader;
		private var myanim: MovieClip;
		private var myanim2: MovieClip;
 
		public function Embed_test() {
			//myanim = new MyClass();
			loader = new Loader();
			/*
			 В следующей строке вместо "new MyClass()" можно использовать myanim для
			 этого нужно раскомментировать все закомментированные выше строки
			*/
			loader.loadBytes(new MyClass());
			loader.contentLoaderInfo.addEventListener(Event.INIT, initListener);
		}
 
		private function initListener(e: Event): void {
			myanim = MovieClip(loader.content);
			addChild(myanim);
			myanim.gotoAndStop(6);
 
			trace("live " + myanim.live);
			myanim.test();
		}
 
	}
}
Как видно, я могу в теле основной программы управлять анимацией и обращаться к public методам и свойствам загруженного файла. Фух, круто.

Старый 22.06.2009, 20:16
Яски вне форума Посмотреть профиль Отправить личное сообщение для Яски Найти все сообщения от Яски
  № 9  
Ответить с цитированием
Яски

блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
Странно, я всегда использовал способ описанный выше, ни разу ексепшенов не было
__________________
TankiOnline
Я разработчик Alternativa3D

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

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

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


 


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


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