Menu deroulant dynamique ... fonction globale ?

Messages postés
1
Date d'inscription
vendredi 24 avril 2009
Statut
Membre
Dernière intervention
26 novembre 2010
- - Dernière réponse : dj_ouf
Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
- 26 nov. 2010 à 14:33
Bonjour à Tous ,

Je m'appelle Dimitri et je me lance intensivement dans action script depuis 3 bonnes semaines.
Je me suis inspiré d'un exercice du livre Apprendre a Programmer en AS3 ( Anne Tasso ) fin de réaliser mon menu déroulant.

Mon menu fonctionne mais j’aimerai appliquer un event mouse_out sur les items.
En effet j'aimerai que le menu s'affiche lorsque le curseur survole la rubrique ainsi que les items et que le menu se referme lorsque le curseur "quitte" la zone.

Mon probleme est que la fonction que je pense necessaire : aDerouler , ne se situe pas dans la classe item mais dans la classe menu.
Serait-il possible de l'appeler depuis la classe item ?

Merci d'avance pour votre aide !


Item.as

//Définition de la classe Item

package {
import flash.display.*;
import flash.events.*;
public class Item extends Sprite {

private var info:Array;
private var cetItem:ItemMenuClp;
private var vitesse:Number = 12;
private var positionFinale:Number;

public function Item(nx:Number, ny:Number, l:Array) {
cetItem = new ItemMenuClp();
addChild(cetItem);
cetItem.x = nx;
cetItem.y = ny;
cetItem.labelOut.text=l[0];
cetItem.label = l[0];
cetItem.nbElt = l[1];
cetItem.visible = false;

cetItem.addEventListener(MouseEvent.MOUSE_OVER, auSurvol);
cetItem.addEventListener(MouseEvent.MOUSE_OUT, alExterieur);

cetItem.addEventListener(MouseEvent.MOUSE_OVER, auSurvole);


}
private function auSurvol(e:MouseEvent):void {
cetItem.alpha = 0.0;
cetItem.mouseChildren = false;

}
private function alExterieur(e:MouseEvent):void {
cetItem.alpha = 1;
//cetItem.visible = false;
}

private function auSurvole(e:MouseEvent):void {
trace("j'affiche les " + cetItem.nbElt + " éléments de la rubrique " + cetItem.label);
}

public function afficher(yMax:Number):void {
cetItem.visible = true;
positionFinale = yMax;
cetItem.addEventListener(Event.ENTER_FRAME, seDeplaceVersLeBas);
}
function seDeplaceVersLeBas(e:Event):void {
cetItem.y +=vitesse ;
if (cetItem.y >= positionFinale) {
cetItem.y = positionFinale;
cetItem.removeEventListener(Event.ENTER_FRAME, seDeplaceVersLeBas);
}
}

public function effacer(yMin:Number):void {
positionFinale = yMin;
cetItem.addEventListener(Event.ENTER_FRAME, seDeplaceVersLeHaut);
}

function seDeplaceVersLeHaut(e:Event):void {
cetItem.y -=vitesse ;
if (cetItem.y <= positionFinale) {
cetItem.y = positionFinale;
cetItem.removeEventListener(Event.ENTER_FRAME, seDeplaceVersLeHaut);
cetItem.visible = false;
}
}

}
}
///////////////////////////////////////////////////////////////////////////////////////////////
Menu.as


package {
import flash.display.*;
import flash.events.*;
//Définition de la classe Menu extends Sprite
public class Menu extends Sprite {
// Définition des attributs de la classe
private var entete:ItemMenuClp;
private var listeItems:Array;
public var estVisible:Boolean = false;
private var clicSurEntete:Boolean = false;


private function aDerouler(nbr:Number):void {
var x:Number = entete.x;
var y:Number = entete.y;
var h:Number = entete.height;
for (var i:uint = 0; i < nbr; i++) {
listeItems[i].afficher(h*(i+1)+y );
}
}

private function aEnrouler(nbr:Number):void {
var x:Number = entete.x;
var y:Number = entete.y;
var h:Number = entete.height;
for (var i:uint = 0; i < nbr; i++) {
listeItems[i].effacer(y);
}
}

private function ajouterUnItem(rubrique:Array, num:uint):void {
var x:Number = entete.x;
var y:Number = entete.y;
var h:Number = entete.height;
var nvelItem:Item = new Item( x,y, rubrique);
addChildAt(nvelItem,0);
listeItems.push(nvelItem);
}

public function Menu(nom:String, nx:Number, ny:Number, l:Array) {
var nbRubrique:Number = l.length;
entete = new ItemMenuClp();
entete.x = nx;
entete.y = ny;
entete.labelOut.text = nom;
addChildAt(entete,0);
listeItems = new Array();
for (var i:uint = 0; i < nbRubrique; i++) {
ajouterUnItem(l[i], i);
}
entete.addEventListener(MouseEvent.MOUSE_OVER, auSurvol);
entete.addEventListener(MouseEvent.MOUSE_OUT, alExterieur);

entete.addEventListener(MouseEvent.MOUSE_UP, auClic);

// a. l'entête écoute l'événement lié au focus de la souris
entete.addEventListener(FocusEvent.FOCUS_OUT, unClicAilleurs);

}

// a. Si l'entete perd le focus, le menu est enroulé, le drapeau estVisible est remis à false
private function unClicAilleurs(e:FocusEvent):void {
var nbRubrique:Number = listeItems.length;
aEnrouler(nbRubrique);
entete.estVisible = false;
}
private function auSurvol(e:MouseEvent):void {
entete.alpha = 0.4;
}
private function alExterieur(e:MouseEvent):void {
entete.alpha = 0;
}

private function auClic(e:MouseEvent):void {
var nbRubrique:Number = listeItems.length;
if ( !entete.estVisible) {
aDerouler(nbRubrique);
entete.estVisible = true;
} else {
aEnrouler(nbRubrique);
entete.estVisible = false;
}
}
}
}

///////////////////////////////////////////////////////////////////////////////////////////////
FICHIER FLA

/*
# Apprendre à programmer en ActionScript 3
# A. Tasso
# Chapitre 9 : Les principes du concept objet
# Exercice : Un menu déroulant
# Fichier : Exercice 9_8.fla
# Classe : Menu.as et Item.as
*/



function calculerLongueur(liste:XMLList):uint {
var compteur:uint = 0;
for each (var elt:XML in liste) {
compteur++;
}
return compteur;
}

// Script principal
// Déclaration des variables
var largeur:uint = stage.stageWidth;
var hauteur:uint = stage.stageHeight;


// Charger le fichier XML
var chargeurXML:URLLoader = new URLLoader();
chargeurXML.dataFormat = URLLoaderDataFormat.TEXT;
chargeurXML.addEventListener(Event.COMPLETE, gestionXML);
chargeurXML.load(new URLRequest("Repertoire.xml"));

// Une fois chargé, traiter les données contenu dans le fichier XML
function gestionXML(e:Event):void {
try {

var nbGalerie:uint = 0;
var nbImage:uint = 0;
var descriptiong, descriptioni, linki,linkg, nomg:String;
var elt:XML;

// Créer un objet XML et un objet XMLList
var donneesLues:XML = new XML(e.target.data);
var listeGalerie:XMLList = new XMLList();
var listeImage:XMLList = new XMLList();

//
listeGalerie = donneesLues.elements();
nbGalerie = calculerLongueur(listeGalerie);
//
for (var i:int=0; i < (nbGalerie); i++) {
//
descriptiong = donneesLues.galerie[i].@descriptiong;
linkg = donneesLues.galerie[i].@linkg;

nomg = donneesLues.galerie[i].@nomg;
trace (descriptiong);
trace (linkg);
trace (nomg);
//
listeImage = donneesLues.galerie[i].elements();
nbImage=calculerLongueur(listeImage);


rubriqueR1[i] = creerRubrique(nomg,linkg);

var menuR1:Menu = new Menu("Rubrique1",250, 250, rubriqueR1);
addChild(menuR1);



//}
}
} catch (e:TypeError) {
trace("Imposible de charger le XML");
trace(e.message);
}
}




var rubriqueR1:Array = new Array();



function creerRubrique(nom:String, nbElt:String):Array {
var theme:Array = new Array(nom, nbElt);
return(theme);
}

///////////////////////////////////////////////////////////////////////////////////////////////
Afficher la suite 

1 réponse

Messages postés
221
Date d'inscription
vendredi 15 avril 2005
Statut
Membre
Dernière intervention
6 septembre 2011
0
Merci
Salut

Il vaut mieux gérer tous les survols et mouse_out depuis le menu, car tu peux cibler l'ensemble des menus déroulants pour les desafficher.
Je vois dans ce code que lors du mouse_out, on met l'alpha à 0. C'est amplement suffisant.
La classe Item ne doit gérer le mouse_click sur elle-même, et encore...
Commenter la réponse de dj_ouf