自定义导航事件不适用于按钮类

时间:2013-09-05 21:47:36

标签: actionscript-3 button event-bubbling

我正在尝试创建一个关卡选择屏幕,而不是将一堆关卡选项按钮复制并粘贴到我的关卡选择屏幕上,我想尝试使用代码创建和定位按钮以获得更大的灵活性未来。我这样做时遇到了一些问题...主要的问题是我的自定义导航事件,无论出于何种原因,都无法从我的按钮类冒泡到我的主文档类。

我在我的项目中使用了20多个导航事件,所以我很确定问题不是我整个导航事件的方法,但问题是使用按钮类特有的。或者其他我想念的东西。无论如何,我将在下面发布代码。我做了一些痕迹试图弄清楚发生了什么。我的自定义导航事件类正在创建正确的事件,然后我的按钮类调度事件,但是在我的文档类中侦听此事件的代码永远不会运行。所以我假设将导航事件冒泡到顶部有一些问题。这是我最好的猜测,可能是完全不同的东西。如果你们也有不同的建议,如何通过完全重组我所做的事情来使我的关卡选择屏幕更好地工作,那也很好......但这有点神秘,我希望能让它以这种方式工作。非常感谢,这是相关的代码!

---注意:如果这有帮助,层次结构是 DocumentClass - > TitleScreen - > LevelSelectScreen - > LevelSelectButtons

LevelSelectScreen类

public class LevelSelectScreen extends MovieClip {

    public var levelSelectButtons:LevelSelectButtons;

    public function LevelSelectScreen() {

            for (var i:int = 1; i<=2; i++) 
            {
                levelSelectButtons = new LevelSelectButtons(i);
                addChild(levelSelectButtons);
            }
    }

}

LevelSelectButtons类

public class LevelSelectButtons extends SimpleButton {

    public var levelNumber:int;
    public var levelSelectScreen:LevelSelectScreen;

    public function LevelSelectButtons(i) {

        x = 200;
        y = 100 + 50*i;
        addEventListener(MouseEvent.CLICK,LevelSelectClicked,false,0,true)
        levelNumber = i;
    }

    public function LevelSelectClicked(mouseEvent:MouseEvent):void
    {
        if (levelNumber == 1)
        {
            dispatchEvent( new NavigationEvent( NavigationEvent.START ) );
        }
        if (levelNumber == 2)
        {
            dispatchEvent( new NavigationEvent( NavigationEvent.STAGE2 ) );                        }

        }
    }
}

NavigationEvent类

package  
{
    import flash.events.Event;
    public class NavigationEvent extends Event 
    {
        public static const START:String = "start";
        public static const LEVELSELECTSCREEN:String = "levelselectscreen";
        public static const STAGE2:String = "stage2";

        public function NavigationEvent( type:String, bubbles:Boolean = false, cancelable:Boolean = false ) 
        { 
            super( type, bubbles, cancelable );         
            trace(type);
        } 

        public override function clone():Event 
        { 
            return new NavigationEvent( type, bubbles, cancelable );
        }

        public override function toString():String 
        { 
            return formatToString( "NavigationEvent", "type", "bubbles", "cancelable", "eventPhase" ); 
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果您希望事件冒泡,则需要将bubbles属性设置为true。

dispatchEvent( new NavigationEvent(NavigationEvent.START, true) );