AS3: распространение пользовательских событий - PullRequest
0 голосов
/ 29 мая 2011

Я пытаюсь собрать проектор из последовательности загруженных извне swfs, и мой общий вопрос будет настолько коротким, насколько это возможно.

Если внешний SWF, загруженный в ctrl (экземпляр MovieClip, помещенный на сцену во время разработки), имеет в своем первом и последнем кадрах:

 dispatchEvent(new Event("FIRST_FRAME")); // in the first frame, and: 
 dispatchEvent(new Event("LAST_FRAME")); // in the last frame 

затем - должны ли эти события быть "услышаны" в контейнере ctrl?

В настоящее время мне кажется, что я могу только слушать эти события в загруженном контенте, а не "выше", я имею в виду - если я скажу в загрузчике полный слушатель:

mc:MovieClip = MovieClip(e.currentTarget.content);
mc.addEventListener("LAST_FRAME", function(){ // something });

тогда слышны события, но не тогда, когда я говорю:

ctrl.addEventListener("LAST_FRAME", function(){ // something });

Последнее кажется более устойчивым, поэтому я изо всех сил пытаюсь заставить его работать, но я думаю, что я пропустил некоторые уроки ;-) Кто-нибудь прошел через это? Правильный ли мой подход или я должен пойти другим путем?

Приветствует всех.

1 Ответ

0 голосов
/ 29 мая 2011

Вы можете получить экранный объект crtl для получения события, отправленного с вашего внешнего SWF-файла, установив для параметра пузырей значение true при отправке вашего события.Посмотрите на следующий пример, где SWFB.swf загружается в SWFA.swf:

SWFB:

package swfb
{
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.utils.Timer;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            const SECOND:int = 1000;

            var timer:Timer = new Timer(5 * SECOND, 1);
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete);
            timer.start();

        }// end function

        private function onTimerComplete(e:TimerEvent):void
        {
            dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE, true, true));

        }// end function

    }// end class

}// end package

SWFA:

package swfa
{
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.net.URLRequest;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaderComplete);
            loader.load(new URLRequest("swf/SWFB.swf"));


        }// end function

        private function onLoaderComplete(e:Event):void
        {
            var loaderInfo:LoaderInfo = LoaderInfo(e.target);

            var container:Sprite = new Sprite();
            container.addChild(loaderInfo.content);
            container.addEventListener(TimerEvent.TIMER_COMPLETE, onContainerTimerComplete);
            addChild(container);

        }// end function

        private function onContainerTimerComplete(e:TimerEvent):void
        {
            trace("TIMER COMPLETE!");

            e.stopPropagation();

        }// end function

    }// end class

}// end package

SWFB.swf отправляет Timer событие через 5 секунд после его добавления на сцену.Когда он отправляет событие, для пузырьков и отменяемых параметров устанавливается значение true.

В SWFA.swf в него загружается SWFB.swf, а затем добавляется в контейнер экранного объекта с именем container.Затем слушатель события добавляется в контейнер, который прослушивает отправку события Timer из SWFB.swf.При отправке обработчик события onContainerTimerComplete() вызывает метод stopPropagation() события Timer, чтобы (как следует из его названия) остановить распространение события.

...