【问题标题】:Actionscript 3 menu with active state具有活动状态的 Actionscript 3 菜单
【发布时间】:2010-01-19 01:34:45
【问题描述】:

我有一个简单的菜单,当悬停每个项目时,播放影片剪辑,然后在 mouse_out 上反向播放影片剪辑。我想要做的是在点击时显示第三种状态(活动)。我想我需要按照以下方式做一些事情:

点击时,gotoAndStop(5) //5 是我活动框架的位置 还要删除触发函数反向播放电影的事件侦听器。 然后,当单击另一个菜单项时,将事件侦听器重新添加到上一个菜单项,使其不会卡在“活动”中

不过,我不知道该怎么做。我的代码如下:

// IMPORTS

import fl.transitions.*;
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.external.ExternalInterface;

// EVENT LISTENERS

//arrow
mcArrow.addEventListener(MouseEvent.MOUSE_OVER,mover);
mcArrow.addEventListener(MouseEvent.MOUSE_OUT,mout);

//dots
mcDots.addEventListener(MouseEvent.MOUSE_OVER,mover);
mcDots.addEventListener(MouseEvent.MOUSE_OUT,mout);

//music
mcMusic.addEventListener(MouseEvent.MOUSE_OVER,mover);
mcMusic.addEventListener(MouseEvent.MOUSE_OUT,mout);

//home
mcHome.addEventListener(MouseEvent.MOUSE_OVER,mover);
mcHome.addEventListener(MouseEvent.MOUSE_OUT,mout);

//padlock
mcPadlock.addEventListener(MouseEvent.MOUSE_OVER,mover);
mcPadlock.addEventListener(MouseEvent.MOUSE_OUT,mout);

// FUNCTIONS

function mover(e:MouseEvent):void {
    stopPlayReverse(e.currentTarget as MovieClip);
    e.currentTarget.play();
//var fadeIn:Tween = new Tween(mcToolTip, "alpha", Strong.easeOut, 0, 1, 0.5, true);
}

function mout(e:MouseEvent):void {
    var mc:MovieClip = e.currentTarget as MovieClip; 
    if (mc !== null) {
     mc.addEventListener(Event.ENTER_FRAME, playReverse, false, 0, true);
    }
    //var fadeOut:Tween = new Tween(mcToolTip, "alpha", Strong.easeOut, 1, 0, 0.5, true);
}

function playReverse(e:Event):void {
    var mc:MovieClip = e.currentTarget as MovieClip; 

    if (mc.currentFrame == 1) {
        stopPlayReverse(mc);
    } else {
        mc.prevFrame();
    }
}

function stopPlayReverse(mc:MovieClip):void {
  if ((mc!==null) && mc.hasEventListener(Event.ENTER_FRAME)) {
    mc.removeEventListener(Event.ENTER_FRAME, playReverse);
  }
}

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    首先,我将创建一个 MenuItem 类,它为菜单项设置事件侦听器和方法。在 MenuItem 类中,创建一个布尔类型的“isActive”属性,用于跟踪菜单项的当前状态。这是该类的快速模型:

    package {
        import flash.display.MovieClip;
        import flash.events.*;
    
        public class MenuItem extends MovieClip {
            public var isOver:Boolean = false;
            public var isActive:Boolean = false;
            public static var CLICK:String = 'menu_item_click';
    
            public function MenuItem() {
                addEventListener(MouseEvent.MOUSE_OVER, mover);
                addEventListener(MouseEvent.MOUSE_OUT, mout);
                addEventListener(MouseEvent.CLICK, mclick);
                addEventListener(Event.ENTER_FRAME, onFrame);
            }
    
            private function mover(e:MouseEvent):void {
                isOver = true;
            }
    
            private function mout(e:MouseEvent):void {
                isOver = false;
            }
    
            private function mclick(e:MouseEvent):void {
                isActive = true;
                goToAndStop(5); // go to active frame
            }
    
            private function onFrame(e:Event):void {
                if (isActive) return; // don't do anything if this menu item is active
    
                if (isOver) { // if the mouse is over the menu item
                    if (currentFrame >= 4) { // make sure we don't go to frame 5, the active frame
                        nextFrame();
                    }
                } else {
                    prevFrame(); // or play in reverse. If at frame 1, prevFrame() won't do anything
                }
            }
        }   
    }
    

    ENTER_FRAME 监听器将持续运行并根据 isActive 和 isOver 状态执行操作。这样就无需删除侦听器并为 playReverse 和 stopPlayReverse 创建其他方法。

    其次,我会将所有菜单项放在名为 MenuContainer 的容器类中。最简单的方法是在 Flash 中创建一个空影片剪辑,然后将所有菜单项拖入其中。使用 MenuContainer 的 Class 值导出 Actionscript 的容器。这是 MenuContainer 类的模型:

    package {
        import flash.display.MovieClip;
        import flash.events.*;
    
        public class MenuContainer extends MovieClip {
    
            public function MenuContainer() {
                addEventListener(MenuItem.CLICK, onMenuItemClick);
            }
    
            private function onMenuItemClick(e:MouseEvent):void {
                var clickedMenuItem:MenuItem = MenuItem(e.target); // the clicked menu item
                for (var i:int = 0; i < this.numChildren; i++) { // loop through the menu items
                    var menuItem:MenuItem = MenuItem(this.getChildAt(i)); // get the loop menu item
                    if (menuItem != clickedMenuItem) { // if the loop menu item is not the clicked menu item
                        menuItem.isActive = false; // then isActive is false
                    }
                }
            }
    
        }   
    }
    

    【讨论】:

      【解决方案2】:

      在您的代码之后的另一个选项是有一个辅助变量来指示哪个菜单项当前处于活动状态,因此我们可以在单击另一个项后停用它...这意味着您的每个菜单项都会执行此操作点击功能:

      private var activeMenuItem:MenuItem; //your auxiliary variable
      private function onClick(e:MouseEvent):void {
         if(activeMenuItem) {
           //if there is an active menu item re-enable it
           activeMenuItem.gotoAndStop(1);
           activeMenuItem.mouseEnabled=true;
         }
         //set the active menu item to the clicked one
         activeMenuItem=e.currentTarget;
         //and set its state to active and mouse disabled
         activeMenuItem.gotoAndStop(5);
         activeMenuItem.mouseEnabled=false;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多