Пользовательские события с помощью Singleton EventDispatcher, используя getDefinition от child - PullRequest
1 голос
/ 11 июня 2011

РЕДАКТИРОВАТЬ: по любой причине, он работает в браузере, но не при компиляции / отладке в IDE.

Я не могу получить мои внешние SWF-файлы для получения уведомлений от моего менеджера одноэлементных событий (EventDispatcher). Вот подробности:

  • Я добавляю детей из внешнего SWF-файла, используя метод getDefinition, в мой основной SWF-файл.
  • Я использую одноэлементный EventDispatcher, который отвечает за прослушивание и диспетчеризацию.
  • Использование пользовательского класса событий.

В этом коде я пытаюсь получить кнопку отключения звука, чтобы сообщить основному SWF, что значок отключения звука был нажат (SoundClipEvent.MUTE_CLICK). После отключения звука он должен отправить событие (SoundClipEvent.STATE) и подтвердить muteIcon состояние. В настоящее время значок отключения звука успешно отправляет событие MUTE_CLICK, и основной класс документа SWF может его забрать. MuteIcon (дочерний MC SWF) ничего не слышит от синглтона.

Ваша помощь в этой проблеме очень ценится!

SoundClipManager.as:

import flash.events.Event;
import flash.events.EventDispatcher;

public dynamic class SoundClipManager extends EventDispatcher {
    private static var isMuted:Boolean;

    public function SoundClipManager(blocker:SingletonBlocker):void {
        super();
        //
        if (blocker == null) {
            throw new Error("Error: Instantiation failed; Use SoundClipManager.getInstance()");
        }
    }

    public static function get muted():Boolean {
        return SoundClipManager.isMuted;
    }

    public static function set muted(value:Boolean) {
        SoundClipManager.isMuted = value;
        //
        SoundClipManager.getInstance().dispatchEvent(new SoundClipEvent(SoundClipEvent.STATE,SoundClipManager.muted));
    }

    public static function getInstance():SoundClipManager {
        if (instance == null) {
            instance = new SoundClipManager(new SingletonBlocker());
        }
        return instance;
    }

    public override function dispatchEvent(evt:Event):Boolean {
        return super.dispatchEvent(evt);
    }

    private static function stateChanged(evt:*) {
        trace('state changed!');
    }        
}

internal class SingletonBlocker {}

MuteIcon.as

import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
//
public dynamic class IconMute extends MovieClip {
    public function IconMute() {
        this.addEventListener(Event.ADDED_TO_STAGE,this.addedToStage);
        //
        SoundClipManager.getInstance().addEventListener(SoundClipEvent.STATE,this.soundClipManagerStateChanged);
    }
    //
    //  Methods, Private
    //

    //
    //  Events
    //
    private function muteClick(evt:MouseEvent) {
        SoundClipManager.getInstance().dispatchEvent(new SoundClipEvent(SoundClipEvent.MUTE_CLICK));
    }
    //
    private function addedToStage(evt:Event) {
        this.addEventListener(MouseEvent.CLICK,this.muteClick);
    }
    //
    private function soundClipManagerStateChanged(evt:*) {
                    trace("state changed!");
    }
}

SoundClipEvent.as

package  {
//
import flash.events.Event;
//
public class SoundClipEvent extends Event {

    public static const MUTE_CLICK:String = "muteClick";
    public static const STATE:String = "state";
    //
    public var muted:Boolean;

    public function SoundClipEvent(type:String,muted:Boolean = false) {
        if(muted) this.muted = muted;
        //
        super(type,true,false);
    }

}

}

1 Ответ

1 голос
/ 11 июня 2011
Метод

getDefinitionByName(className) будет работать только в том случае, если в вашем коде было указано className. Вы можете просто импортировать className класс в файл, в который вы собираетесь позвонить getDefinitionByName(className). Это должно помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...