在主类AS3上收听自定义事件

时间:2014-01-01 19:58:50

标签: actionscript-3 flash

这是我在actionscript中的小问题。为了简单起见,我把两个小类放在一起来证明我的问题。

所以从RedState.as我发送自定义事件,女巫将字符串传递给听众。我想听这个事件,并在root类中获取传递的字符串。

如果我在另一个班级听同一个事件,一切似乎都没问题,但是主班没有反应:(:D

package 
{
    import assets.ButtonController;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.MouseEvent;


    public class Main extends Sprite 
    {

        public var nameCollection:Array
        public var sManager:SceneManager
        public var cText:TempClass
        public var bManager:ButtonController;

        public var red:RedState
        public function Main():void 
        {   
            addEventListener(Event.ADDED_TO_STAGE, init);
        }
        public function init (e:Event):void {
            red = new RedState();
            addChild(red);
            addEventListener(TextDispatcher.SEND_TEXT, red_sendText);

        }

        public function red_sendText(e:TextDispatcher):void 
        {   trace ("Something")
            trace (e.url)
        }





    }

}


package  
{
    import flash.display.Sprite;

    public class RedState extends Sprite 
    {
        [Embed(source = "assets/states/red.png")]
        public var Red:Class;

        public var red:Sprite;

        public function RedState() 
        {
            red = new Sprite();
            red.addChild(new Red());
            addChild(red);
            dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT, "I wanna Sing!!"))

        }

    }

}

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您正试图从TextDispatcher.SEND_TEXT班级发送RedState。假设一切设置正确,有两个原因可以解释为什么不分派事件。第一个是你没有将监听器添加到RedState实例。那就是:

public function init (e:Event):void {
    red = new RedState();
    red.addEventListener(TextDispatcher.SEND_TEXT, red_sendText);
    addChild(red);
}

添加它将允许dispatchEvent从RedState起作用,因为现在RedState实例将监听它。但是RedState构造函数还有另一个问题:

public function RedState() {
    red = new Sprite();
    red.addChild(new Red());
    addChild(red);
    //trying to dispatch here will not work
    dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT, "I wanna Sing!!"))
 }

您正在尝试在添加侦听器之前调度事件。目前没有任何具有此事件侦听器的对象,因此它永远不会运行red_sendText()

因此你应该做这样的事情:

public function init(e:Event):void {
    red = new RedState();
    red.addEventListener(TextDispatcher.SEND_TEXT, red_sendText);
    red.runText();
    addChild(red);
}

然后在你的RedState中:

public function RedState() {
    red = new Sprite();
    red.addChild(new Red());
    addChild(red);
}

public function runText():void {
    dispatchEvent(new TextDispatcher(TextDispatcher.SEND_TEXT));
}

现在,在您致电RedState之前,您的runText()实例将会收听此事件。