2010-01-18 5 views
0

J'ai un menu simple qui, au survol de chaque élément, lit un clip, puis à mouse_out il lit le clip en sens inverse. Ce que j'essaye de faire est d'avoir un troisième état (actif) qui est montré en cliquant. Je pense que je dois faire quelque chose comme:Menu Actionscript 3 avec état actif

Lorsque cliqué, gotoAndStop (5) // Cinq étant l'emplacement de mon cadre actif Supprime également l'écouteur d'événement qui déclenche la fonction pour lire le film dans sens inverse. Puis, lorsqu'un autre élément de menu est cliqué, rajoutez l'écouteur d'événement à l'élément de menu précédent afin qu'il ne soit pas bloqué 'actif'

Je n'arrive pas à comprendre comment faire cela. Mon code est le suivant:

// 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); 
    } 
} 

Répondre

0

D'abord, je voudrais créer une classe MenuItem qui met en place les écouteurs d'événements et méthodes pour les éléments de menu. Dans la classe MenuItem, créez une propriété 'isActive' de type Boolean qui conserve l'état actuel de l'élément de menu. Voici une maquette rapide de cette classe:

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 
      } 
     } 
    } 
} 

L'auditeur ENTER_FRAME fonctionne en continu et effectuer des actions sur la base des états isActive et Isover. Cela élimine le besoin de supprimer les écouteurs et de créer des méthodes supplémentaires pour playReverse et stopPlayReverse. Deuxièmement, je mettrais tous les éléments de menu dans la classe conteneur appelée MenuContainer. La méthode la plus simple consiste à créer un clip vide dans Flash, puis à y glisser tous les éléments de menu. Exportez le conteneur pour Actionscript avec la valeur Class de MenuContainer. Voici une maquette de la classe 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 
       } 
      } 
     } 

    } 
} 
0

Une autre option, suivant votre code, serait d'avoir une variable auxiliaire qui indique quel élément de menu est actuellement actif, nous pouvons le désactiver une fois que nous cliquons sur un autre élément ... cela signifie que chacun de vos éléments de menu exécuterait cette fonction sur le clic:

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; 
}