【问题标题】:Flash Actionscript 3 Toggle Menu Buttons on/offFlash Actionscript 3 打开/关闭切换菜单按钮
【发布时间】:2010-12-25 08:10:03
【问题描述】:

这可能很简单,但我想不通。看一下代码,我将这个按钮类(CategoryButton)的 2 个实例移到了舞台上。正如您所看到的,当您单击一个按钮时,它应该 gotoAndPlay(3),将自身记录为 selectedBtn。单击第二个按钮时,它应该重新启用第一个按钮的侦听器,删除自己的侦听器并将自己设置为新选择的按钮。不幸的是,这段代码没有这样做。当我单击第一个按钮时,它会将按钮移动到第 3 帧,并删除其侦听器。我单击第二个按钮,它执行相同的操作,只是它不再为第一个按钮添加侦听器。

我是 AS3 新手,非常感谢任何帮助,谢谢。

package classes {
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    import flash.display.Sprite;

    public class CategoryButton extends MovieClip{

        //this stores the currently selected button
        public var selectedBtn:Object;

        public function CategoryButton() {
            // listen for over
            addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);

        }

        protected function rolloverToggle(event:MouseEvent):void {
            gotoAndStop(2);
            removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            addEventListener(MouseEvent.CLICK, buttonToggle);
        }

        protected function rolloutToggle(event:MouseEvent):void {
            gotoAndStop(1);
            removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
        }

        protected function buttonToggle(event:MouseEvent):void {
            if(selectedBtn) {
                trace(selectedBtn.name)
                selectedBtn.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.gotoAndStop(1);

                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                event.currentTarget.removeEventListener(MouseEvent.CLICK, buttonToggle);

                event.currentTarget.gotoAndStop(3);

                selectedBtn = event.currentTarget;
            }else {

                selectedBtn = event.currentTarget;
                trace(selectedBtn.name);
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.removeEventListener(MouseEvent.CLICK, buttonToggle);

                selectedBtn.gotoAndStop(3);
            }
        }

    }

}

【问题讨论】:

    标签: flash actionscript-3 oop class


    【解决方案1】:

    我自己对 AS3 并不是很熟悉,但是当您尝试对您的 selectedBtn 对象 if(selectedBtn) 进行布尔测试时,可能会出现问题。为什么不使用诸如“is_selected_button”之类的成员变量来跟踪按钮状态,然后在 if 语句中针对该变量进行测试,而不是针对 Object 进行测试。

    【讨论】:

    • 问题是我让这段代码在没有类的情况下工作,并且我将当前按钮存储为对象。所以我知道布尔值正在工作。我感觉问题出在定义 selectedBtn 的那一行。就像一次只有一个按钮可以看到该变量,因此它会继续执行 else 语句。
    【解决方案2】:

    我是如何解决的:

    1. 按钮 A 被单击(A 设置为 selectedBtn,侦听器已禁用,状态更改为第 3 帧)
    2. 按钮 B 被点击(selectedBtn 的监听器被重置,状态改变,selectedBtn 被设置为按钮 B)

    这就是问题所在,A的监听设置如下:

    addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
    

    这导致按钮 B 再次活跃。解决方法是简单地将侦听器更改为 currentTarget 和 gotoAndStop,用于 over 和 out 状态。

    event.currentTarget.gotoAndStop(1);
    event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
    
    
    package classes {
    import flash.events.MouseEvent;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    
    public class CategoryButton extends MovieClip{
    
        //this stores the currently selected button
        public static var selectedBtn:Object;
    
        public function CategoryButton() {
            // listen for over
            addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            trace("called");
    
        }
    
        protected function rolloverToggle(event:MouseEvent):void {
            event.currentTarget.gotoAndStop(2);
            event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
            event.currentTarget.addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            event.currentTarget.addEventListener(MouseEvent.CLICK, buttonToggle);
        }
    
        protected function rolloutToggle(event:MouseEvent):void {
            event.currentTarget.gotoAndStop(1);
            event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
            event.currentTarget.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
        }
    
        protected function buttonToggle(event:MouseEvent):void {
            if(selectedBtn) {
                trace(selectedBtn.name);
                selectedBtn.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.gotoAndStop(1);
    
                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                event.currentTarget.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                event.currentTarget.removeEventListener(MouseEvent.CLICK, buttonToggle);
    
                event.currentTarget.gotoAndStop(3);
    
                selectedBtn = event.currentTarget;
            }else {
    
                selectedBtn = event.currentTarget;
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
                selectedBtn.removeEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
                selectedBtn.removeEventListener(MouseEvent.CLICK, buttonToggle);
    
                selectedBtn.gotoAndStop(3);
    
            }
        }
    
    }
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-31
      相关资源
      最近更新 更多