![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Jun 2006
Сообщений: 55
|
Прошу помочь решить такую задачу. Необходимо создать swf-файл с анимацией, интегрировать его в основной проект и средствами основного проекта управлять анимацией. Например, в зависимости от значения определенной переменной показывать только кадры анимации с 1 по 5, или только с 6 по 10.
Делаю так. В файле animate.fla на основной временной шкале 10 кадров анимации. В publish settings этого файла указываю Document Class — MyClass. В файле MyClass.as создаю конструктор, который ничего не делает кроме вывода сообщения: В основном проекте интегрирую animate.swf таким образом: [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); } Как заэмбидить эсвээфку так, чтобы можно было программно управлять анимацией? |
|
|||||
|
>>Как заэмбидить эсвээфку так, чтобы можно было программно управлять анимацией?
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); } } } |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 55
|
Спасибо за код, сейчас его испытаю. Ты не мог бы прокомментировать, для чего нужен loader? Зачем загружать объект, если он итак интегрирован в swf? Это не очень ресурсоемкая/долговременная операция?
|
|
|||||
|
если ембедить как флешку, то тоже можно добраться, только там основная линейка загруженного ролика тоже оказывается в лоадере, который в свою очередь еще в какой-то обертке (не вникал в детали)
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] } } |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 55
|
Alex Lexcuk и silin спасибо за ответы, изучил оба ваших варианта, оба они рабочие, но могу никак их прикрутить к своей программе.
Прошу помочь разобраться с проблемой. Боюсь что у меня концептуально неправильный подход к загрузке объектов. Хотелось бы узнать правильно я подхожу к разработке программы или нет. Основной модуль программы я пишу во Flex Builder 3 и я рассчитывал создать несколько анимашек во Flash IDE, заэмбидить из в основное приложение и нужным мне образом в нужное время выводить нужные кадры анимации. Может быть я поступаю неправильно и есть какой-то более грамотный способ организации приложения? ========== По поводу проблем, которые возникли у меня с приведенными выше примерами. При использовании первого варианта возникает такая проблема. У меня подряд идут две строки: После выполнения первой строки, запускается загрузка объекта по методу, который предложил Alex Lexcuk, но при этом строка this.addChild(myanim); выполняется не дожидаясь загрузки нужной мне swf-ки, таким образом, объект на экране появляется, но взаимодействовать с ним все равно нельзя. Но вот если я сначала выполню строчку , потом подожду некоторое время и выполню строчку (я для теста вешал вторую строку на событие клик по любому месту экрана), то анимация корректно отображается и может изменяться моим кодом... В общем, для работоспособности этого примера, нужно дождаться полной загрузки эсвээфки перед добавлением ее в список отображения... Как этого добиться? Генерировать свое событие на онКомлпит загрузки и добавлять мувик в список отображения при возникновении этого события? Или может есть решение попроще? ============ По поводу варианта silin. Мне он кажется наиболее простым и изящным. Честно говоря, я не ожидал что с моей задачей будет столько проблем, казалось примерно так просто она и должна решаться: загрузил мувик и крути его программным способом как душе угодно... но и с этим вариантом возникла непонятная проблема. В том виде, в которым решение тут приведено программа работает, но мне нужно чтобы мувик управлялся без взаимодействия с пользователем, то есть мне нужно избавиться от действий, которые в примере повешены на событие Клик. По этому я модифицировал код так: 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] } } |
|
|||||
|
блогер
Регистрация: May 2008
Адрес: (0, 10, 185) в локальной системе
Сообщений: 721
Записей в блоге: 6
|
Адоби спецы по извращениям
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] } } Там по идее всего один кадр подождать то нужно |
|
|||||
|
Регистрация: 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] (myanim.getChildAt(0) as Loader).contentLoaderInfo.addEventListener(Event.COMPLETE, myanimLoadListener); Добавлено через 33 минуты О! Ура! Разобрался! Есть файл Myanimation.fla с 10 кадрами, у него в качестве Document Class указан файл Myanimation.as с таким содержимым: 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"); } } } 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(); } } } |
|
|||||
|
>>Удивительно, не пойму какая разница выполняю я последние три строки кода сразу, или после клика
разница в том, что нужно время, чтобы загрузить контент в лоадер, вроде бы достаточно одного кадра, но как Яски показал надежнее |
![]() |
![]() |
Часовой пояс GMT +4, время: 08:52. |
|
|
« Предыдущая тема | Следующая тема » |
|
|