Forums Développement Multimédia

Aller au contenu

- - - - -

Ecouteurs d'evenements sur un Sprite

CODE AS3 Flash

85 réponses à ce sujet

#46 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 28 August 2015 - 07:29 AM

Bonjour Monsieur Spi,

Je souhaite masquer les quatres boutons si je clique sur l'un d'eux et ouvrir une nouveau menu (pour chaque bouton) avec une petite croix en haut a droite de l'objet pour revenir dans le menu principal et ainsi ré-afiicher les bouton et les objet "fond" et ''logo''

le truc que je n'arrive pas a piger c'est que normalement avec l'instruction :
bouton.name = "bouton"+n;

Je crée 5 boutons, "bouton0", "bouton1", "bouton2", "bouton3", "bouton4" ( chose que j'ai verifié en faisant un trace("bouton+n") .
Alors pourquoi en faisant un removeChild(bouton0) ça deconne ?

Merci pour ton aide .

#47 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 31 August 2015 - 20:32 PM

vous avez une idée, pourquoi les instructions :
-removeChild(bouton0)
-removeChild(bouton1)
-removeChild(bouton2)
-removeChild(bouton3)
removeChild(bouton4)

fonts bugger le script ?

#48 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 6954 messages

Posté 31 August 2015 - 21:09 PM

Bonsoir,

Parce que a mon avis tu confond la propriété "name" d'un clip et son "nom d'instance".
Ça fait longtemps que je ne code plus à l'aide de la timeline, mais si mes souvenirs sont exacts, clique sur tes boutons dans la scène et regarde le panneau de propriétés, tes clips doivent porter le nom d'instance "bouton0", ... leur propriété "name" c'est autre chose qui permet d'utiliser la méthode "getChildByName" pour retrouver un clip dans une displayList (ce qui est déconseillé, il vaut mieux passer par un tableau comme je te l'ai recommandé plus haut).

Les problèmes que tu rencontre sont dus à une méconnaissance du logiciel et des méthodes de programmation, tu mélange timeline (prévue pour les graphistes et animateurs) et code (prévu pour les développeurs). Or le mélange des deux, bien que passage obligé pour la plupart des débutants, demande une certaine connaissance du logiciel pour réussir à comprendre pourquoi ça bloque (souvent par construction) à un moment donné et en quoi les deux systèmes (code et animation) sont différents. Ce n'est pas impossible de concilier les deux, mais c'est vachement plus contraignant que de tout faire directement en code. Si tu veux avancer je te recommande de t'entrainer avec les exercices du Wiki : http://forums.mediab...x/flashplatform il y a plein de choses sympas et ludiques.

Pour en revenir à ton souci, tu devrais essayer de ne plus te servir de la scène et de la timeline que pour dessiner tes objets, les convertirs en clips (F8) puis t'intéresser à la bibliothèque et aux propriétés des objets qui s'y trouvent. Tu verra l'option "exporter pour AS", quand tu la coche l'IDE te demande d'entrer un nom de classe, il te suffit de mettre le nom de ton objet pour en faire une "classe". Et une "classe" est un moule qui te permet de créer autant d'objets que tu le souhaite. Ceci devrait te simplifier la vie quand tu veux t'y retrouver entre tes objets dans le code. Une boucle crée les objets à partir d'une classe, elle enregistre chaque objet créé dans un tableau, on retrouve les objets en parcourant le tableau, peu importe où ils sont affichés et le nom qu'ils portent, il suffit de connaître l'index dans le tableau pour retrouver l'objet. Et hop, te voici avec un système beaucoup plus libre que celui contraint par la scène et la timeline. Tu sais créer des objets à la volée de puis un moule, puis les placer sur la scène (addChild) et les retirer (removeChild).

Prenons un exemple, je veux créer 5 boutons à l'aide du code.
Je dessine mon bouton sur la scène, puis je le converti en MovieClip (F8).
Je coche la case "Exporter pour AS" et je donne le nom de classe : Bouton (avec une majuscule, ça permet de reconnaitre une classe)
Je supprime mon clip de la scène, il est stocké dans la bibliothèque avec un nom d'export, je peux m'en servir dans le code.
Ok ma scène est vide, je vais y taper mon programme sur la première frame du calque 0, j'ouvre la fenêtre de code (F9).

// je crée les variables globales

var i:int;                                                      // itérateur
var stockBoutons:Array;                         // tableau de stockage
// et je lance le programme
init();

// initialisation du programme
function init():void {

        // je valorise les variables
        stockBoutons = []                                // tableau vide
        i = 0;                                                   // valeur par défaut de i
       
        // je boucle sur 5 itérations
        for (i = 0; i < 5; i++) {
                var btn = new Bouton();         // création d'un nouveal objet "bouton"
                btn.x = i * btn.width;          // position du bouton sur X
                btn.y = 10;                                     // position du bouton sur Y
                btn.index = i;                          // index du bouton
                addChild(btn);                          // ajout du bouton à l'affichage
               
               
                // écouteurs du bouton
                btn.addEventListener(MouseEvent.CLICK, clickBouton);
               
                // ajout du bouton au stock
                stockBoutons.push(btn);
        }      
       
}

// fonction commune aux boutons
function clickBouton(e:MouseEvent):void {
        // action selon le bouton
        if (e.target.index == 0) {//action du bouton 0};
        if (e.target.index == 1) {//action du bouton 1};
        if (e.target.index == 2) {//action du bouton 2};
        if (e.target.index == 3) {//action du bouton 3};
        if (e.target.index == 4) {//action du bouton 4};

        // actions communes
       
        // masquer les autres boutons
        for (i = 0; i < stockBoutons.lenght; i++) {
                if (stockBoutons[i] != e.target) {
                        stockBoutons[i].alpha = 0;
                }
        }
       
        // (ou) supprimer les autres boutons
        for (i = 0; i < stockBoutons.lenght; i++) {
                if (stockBoutons[i] != e.target) {
                        remvoveChild(stockBoutons[i]);
                }
        }
       
        // (ou) ...
}

Rien sur la timeline, tout dans des tableaux, il suffit de parcourir le tableau pour savoir quel est le clip concerné.

#49 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 05 September 2015 - 20:14 PM

Bonjour Monsieur Spi,

Effectivement je pensais que la proprieté .Name et l'instance d'un objet etait pareil .

Oui j'ai utilisé cette methode pour crée deux objets graphique, l'objet "Fond" qui est un fond d'ecran, et l'objet "logo" qui est le logo de mon ecole, je les ai convertis en clip, exporté en AS3 puis supprimé de la scene exactement comme tu dit .

Ensuite dans mon code j'utilise les proprieté x et y pour les placé sur la scene et je fait un AddChild(Logo) et AddChild(Fond) pour les affichés, jusqu'a tout aller bien .


var fond = new fond ;
fond.width = 1920;
fond.y = -100;
addChild(fond);


var Logo = new Logo ;
logo.x = 200;
addChild(logo);

En ce qui concerne mes 5 boutons maintenant, plutot que continuer dans cette voie (creation de clip et convertion en class pour l'as3) j'ai voulu les crée via le code, Gustav02 m'a grandement aidé a faire cela.
Ensuite je voulais entré dans un sous menu et retirer l'affichage de l'objet logo et fond via un removeChild mais aussi des cinq boutons, mais le fait d'avoir mis une boucle pose probleme j'ai l'impression, car pour "recuperer" le nom d'instance de cette objet de type "Bouton" c'est pas simple car a la fin de la boucle Gustav02 a fait un addChild(bouton); mais moi en faisant un removeChild(bouton) ça ne fonctionne pas .

Pour simplifier, ne pourrais je pas reussir a jouer sur l'affichage de mes bouton en supprimant cette boucle et la remplacer par ça :

var bouton:Bouton1 = new Bouton();
bouton1.x = 425 + (n*295);
addChild (bouton1)


var bouton:Bouton2 = new Bouton();
bouton2.x = 425 + (n*295);
addChild (bouton2)


var bouton:Bouton3 = new Bouton();
bouton3.x = 425 + (n*295);
addChild (bouton3)


var bouton:Bouton4 = new Bouton();
bouton4.x = 425 + (n*295);
addChild (bouton4)


var bouton:Bouton5 = new Bouton();
bouton5.x = 425 + (n*295);
addChild (bouton5)



Je vais incorporer ton code et tester cela, je reviens vers toi rapidement si cela ne te derange pas car j'aimerai beuacoup continuer mon p'tit projet .

Encore merci pour ton aide .

#50 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 05 September 2015 - 20:36 PM

Monsieur Spi ,

Je te confirme apres avoir testé ce code fonction parfaitement :

var bouton1:Bouton = new Bouton("PLS");
bouton1.x = 425;
addChild(bouton1);
bouton1.addEventListener(MouseEvent.CLICK,Menu1);

var bouton2:Bouton = new Bouton("CARRUSSEL");
bouton2.x = 425 + (1*295);
addChild(bouton2);
bouton2.addEventListener(MouseEvent.CLICK,Menu2);

var bouton3:Bouton = new Bouton("TENSIONADORES");
bouton3.x = 425 + (2*295);
addChild(bouton3);
bouton3.addEventListener(MouseEvent.CLICK,Menu3);

var bouton4:Bouton = new Bouton("DOLLYBASES");
bouton4.x = 425+ (3*295);
addChild(bouton4);
bouton4.addEventListener(MouseEvent.CLICK,Menu4);

var bouton5:Bouton = new Bouton("GUINCHOS");
bouton5.x = 425+ (4*295);
addChild(bouton5);
bouton5.addEventListener(MouseEvent.CLICK,Menu5);


function Menu1(event:MouseEvent):void{
removeChild(fond);
removeChild(logo);
removeChild(bouton1);
removeChild(bouton2);
removeChild(bouton3);
removeChild(bouton4);
removeChild(bouton5);


Malheureusement c'est moins joli que ce qu'a fait Gustav02 avec ça boucle, et et ne comprends toujours pas pourquoi l'instruction

removeChild(bouton); dans un fonction sur un ecouteur d'evemement n'enleve pas l'affichage des 5 objets bouton present sur la scene, as tu une idée ?


var tab:Array = new Array("PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS");

for(var n:uint = 0; n < tab.length; n++){
var bouton:Bouton = new Bouton(tab[n]);
bouton.x = 425 + (n*295);
bouton.name = "bouton"+n;
bouton.addEventListener(MouseEvent.MOUSE_OVER, this["bt"+n]);
bouton.addEventListener(MouseEvent.CLICK,this["Menu"+n]);
addChild(bouton);
trace(bouton.name);
}



function Menu0(event:MouseEvent):void{
removeChild(fond);
removeChild(logo);
removeChild(bouton);

#51 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 07 September 2015 - 15:14 PM

Comme toujours, la solution à mon avis la plus simple et la plus propre est d'utiliser un "conteneur" supplémentaire qui servira de "boite". Et comme le dit Mr Spi : un tableau ! C'est un effort a faire si tu veux progresser.

Sinon, répondre à ta question n'a pas vraiment d'intérêt pour toi : tu confonds "nom des boutons" et "objet".
Le nom des boutons est une variable de type String, tes boutons sont des objets de type Bouton. Ce n'est pas du tout la même chose. Il faut, très rapidement, que tu oublies cette façon de penser en voulant aller chercher un objet par son nom. On tiens un objet par lui-même c'est beaucoup plus pratique, efficace, propre (et ça oblige à "penser bien"), crois moi.

Petite preuve en passant (code non testé, non relu) :
var bouton:Bouton; // Une variable pour pouvoir parler d’un bouton, de façon générique
var boutons:Array = []; // Un tableau pour ranger les boutons
var afficheur_des_boutons:Sprite = new Sprite(); // Un conteneur pour afficher les boutons
addChild(afficheur_de_boutons); // On affiche le conteneur de boutons
afficheur_de_boutons.addEventListener(MouseEvent.CLICK,click_menu); // On écoute les événements souris sur l’afficheur

// Une boucle pour créer les boutons (c'est là que c'est [s]magique[/s] bien pensé)
for each(var nom:String in ["PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS"]) {
  bouton = new Bouton(nom);
  bouton.x = 425 + boutons.length * 295;
  boutons.push(bouton);
  afficheur_de_boutons.addChild(bouton);
)
function click_menu(event:Event) {
  // Je retire tous les boutons d’un coup !
  removeChild(afficheur_des_boutons);
  // Puis je gère les cas particuliers si besoin :
  switch(event.target.name) {
        case ("PLS") : trace ("PLS"); break;
        case ("CARRUSSEL") : trace ("CARRUSSEL"); break;
        case ("TENSIONADORES") : trace ("TENSIONADORES"); break;
        case ("DOLLYBASES") : trace ("DOLLYBASES"); break;
        case ("GUINCHOS") : trace ("GUINCHOS"); break;
  }
}


#52 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 09 September 2015 - 22:29 PM

Bonjour Dldler,

Merci pour ta reponse !
Effectivement j'ai pas mal de lacunes au sujet de ces notions et surtout en As3 , je vais mettre un petit coup de colier sur les boucles en As3 et tester ton code .

J'aimerai quand meme te pose une question sur l'affiche des objet en As3, dans mon code je génère via la boucle For 5 objets de type "bouton" grace a cette instruction :

for(var n:uint = 0; n < tab.length; n++){
var bouton:Bouton = new Bouton(tab[n]);
bouton.x = 425 + (n*295);
bouton.name = "bouton"+n;
bouton.addEventListener(MouseEvent.MOUSE_OVER, this["bt"+n]);
bouton.addEventListener(MouseEvent.CLICK,this["Menu"+n]);
addChild(bouton);
trace(bouton.name);
}

Peux tu me dire pourquoi l'application ne comprends pas via l'instrution removeChild(bouton) sur un ecouteur d'evenement que je souhaite retirer l'affichage de TOUS les objets de type 'bouton" ?

J'ai testé sur un ecouteur d'evenement l'instruction removeChild sur l'objet logo qui est de type "logo" , l'objet fond qui est de type "fond" (tous les deux des bitmap exporté en as3) et aussi sur l'objet bouton, resultat les objet logo,fond disparaissent de mon ecran mais pas mes quatres boutons, c'est ça qui me perdurbe un peu .

#53 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 10 September 2015 - 08:14 AM

Aucun souci pour retirer les boutons si tu as la "variable" qui cible le bouton, ou mieux un tableau ou les boutons sont stockés. Ton souci, c'est que tu n'as pas cette variable. Du coup, tu tentes de cibler le bouton grâce à son nom (mauvais pratique) et tu n'y arrives pas (et ne compte pas sur moi pour te dire comment faire ;) )

// Créer les boutons
var n:int;
var mes_boutons:Array = [];
for(n = 0; n < 5; n++){
  var bouton:Bouton = new Bouton(n);
  bouton.x = 425 + (n*295);
  addChild(bouton);
  mes_boutons[n] = bouton;
}
// Retirer les boutons
for(n = 0; n < 5; n++){
  removeChild(mes_boutons[i]);
}

Nulle part je ne me sert du nom du bouton. Le nom n'est qu'une propriété du bouton comme une autre, sans intérêt pour cibler celui-ci. Plutôt que rechercher un bouton par son nom, tu pourrais tout pareil le rechercher par sa position en x, puisque tu les connais. Est-ce que ça te paraîtrait adapté ? J'espère que non. Pour le code, rechercher un objet par son nom ou sa position x, ce sont 2 choses identiques. Test de valeur sur une propriété. Faisable dans les 2 cas, mais pas adapté dans les 2 cas. Il n'y a que toi qui accorde de l'importance au nom, et ça, c'est une mauvaise habitude, crois moi.

#54 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 11 September 2015 - 20:27 PM

dlder ,

Merci pour ces explications, j'y vois un peu mieux maintenant !
C'est super ça va me permettre d'avance mon p'tit projet et en meme temps de corriger certaines mauvaise pratique .

Merci egalement a Gustav02 et Monsieur Spi pour votre aide !!!

#55 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 12 September 2015 - 13:05 PM

Dlder,

j'ai testé ton code et j'ai une erreur, "acces a la propritié non definie i " pour cette ligne removeChild(mes_boutons[i]);
Il faut la declarer comme variable ?

#56 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 12 September 2015 - 13:43 PM

Dlder,

j'ai tester ton code sur mon appli :


var bouton:Bouton; // Une variable pour pouvoir parler d’un bouton, de façon générique
var boutons:Array = []; // Un tableau pour ranger les boutons
var afficheur_de_boutons:Sprite = new Sprite(); // Un conteneur pour afficher les boutons
addChild(afficheur_de_boutons); // On affiche le conteneur de boutons
afficheur_de_boutons.addEventListener(MouseEvent.CLICK,click_menu); // On écoute les événements souris sur l’afficheur

// Une boucle pour créer les boutons (c'est là que c'est magique bien pensé)
for each(var nom:String in ["PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS"]) {
bouton = new Bouton(nom);
bouton.x = 425 + boutons.length * 295;
boutons.push(bouton);
afficheur_de_boutons.addChild(bouton);
}

function click_menu(event:Event) {
// Je retire tous les boutons d’un coup !
removeChild(afficheur_de_boutons);
// Puis je gère les cas particuliers si besoin :
switch(event.target.name) {
case ("PLS") : removeChild(fond);; break;
case ("CARRUSSEL") : trace ("CARRUSSEL"); break;
case ("TENSIONADORES") : trace ("TENSIONADORES"); break;
case ("DOLLYBASES") : trace ("DOLLYBASES"); break;
case ("GUINCHOS") : removeChild(logo);; break;
}
}

et la partie "cas particulier" ne fonctionne pas, au click sur l'un des bouton j'ai bien l'affichage de mes boutons qui disparait mais la fonction trace ne s’exécute pas , du coup je n'arrive pas a charger un objet (different pour chaque rubrique) sur la scene . a tu une idée pourquoi ça ne fonctionne pas ?

J'ai aussi voulu jouer avec ton deuxieme code (avec les tableaux) j'en arrive a ça :


//var tab:Array = new Array("PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS");
//
//for(var i:uint = 0; i < tab.length; i++){
// var bouton:Bouton = new Bouton(tab[i]);
// bouton.x = 425 + (i*295);
// bouton.addEventListener(MouseEvent.MOUSE_OVER, this["bt"+i]);
// bouton.addEventListener(MouseEvent.CLICK, Click);
// addChild(bouton);
//
//}
//
//
//
//function bt0(event:MouseEvent):void{
// trace("Sous menu PLS");
//}
//function bt1(event:MouseEvent):void{
// trace("Sous menu Carroussel");
//}
//function bt2(event:MouseEvent):void{
// trace("Sous menu Tensionneurs");
//}
//function bt3(event:MouseEvent):void{
// trace("Sous menu DollyBases");
//}
//function bt4(event:MouseEvent):void{
// trace("Sous menu Winches");
//}
//
//function Click(event:MouseEvent):void{
// removeChild(fond);
// removeChild(logo);
// tab[0].alpha = 0;
//
//
//
//}

malheureusement l'instruction tab[0].alpha = 0; ne fonctionne pas alors que je pensais pouvoir pointer un element dans le tableau garce a son index comme me l'a expliqué monsieur Spi .

aie aie pas facile ...

#57 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 September 2015 - 21:59 PM

Que fait le constructeur bouton ?

#58 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 12 September 2015 - 22:03 PM

Pour ton deuxième souci...
tTon tableu contient des NOMS donc des strings,vet tu tente de changer la transparence des strings ?
Tu n'a toujours pas compris la différence entre un String et un objet... Creuses la dessus

#59 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 12 September 2015 - 22:53 PM

Ha ok !!

Donc le tableau "tab" contiens simplement des variable de type strings, et l'instruction Bouton = new Bouton(tab[i]) permets simplement d'affecter le nom de mon bouton qui est un parametre de la variable 'Bouton"; pour que cela marche il fait crée un tableau dans lequel rangé les boutons (comme ton tableau "boutons" ) . en faiant ça et en remplaçant l'instruction : tab[0].alpha = 0; par boutons[0].alpha = 0; ça devrais fonctionner a priori .

Par contre j'ai bien aimé la premiere version du code que tu as fait avec le conteneur de bouton, as tu une idée pourquoi le action individuelles ne fonctionnent pas ?

#60 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 13 September 2015 - 12:58 PM

Peut-être parce que tes boutons n'ont pas de nom ? C'est pour ca que je te demandais ce que fait le code de ta Classe Bouton... Si elle renseigne bien le nom de l'occurrence, ça devrait marcher. Mais peut être que ce n'est qu'une classe créée en automatique (via la
) , donc sans aucun code et que la propriété 'nom' n'est pas renseignée

#61 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 13 September 2015 - 13:50 PM

Dldler,

voici le contenu de la classe Bouron ;

package {
import flash.display.Sprite;
import flash.display.Shape;
import flash.text.TextFormat;
import flash.text.TextFormatAlign;
import flash.text.TextField;
import flash.display.SimpleButton;

public class Bouton extends Sprite {

public function Bouton( texte:String ) {

var format:TextFormat = new TextFormat();
format.align = TextFormatAlign.CENTER;
format.color = 0x666666;
format.font = "Arial";
format.size = 15;
format.bold = true;

//////////////////////////////////////////////////////////////////////
var repos:Sprite = new Sprite();

var reposFond:Shape = new Shape();
reposFond.graphics.beginFill(0xFFFFFF);
reposFond.graphics.drawRect(0, 0, 295, 120);
reposFond.graphics.endFill();
repos.addChild(reposFond);

var reposTexte:TextField = new TextField ();
reposTexte.width = 295;
reposTexte.height = 20;
reposTexte.y = 90;
reposTexte.defaultTextFormat = format ;
reposTexte.text = texte;
repos.addChild(reposTexte);
/////////////////////////////////////////////////////////////////////////
var survol:Sprite = new Sprite();

format.color = 0x1979BB;

var survolFond:Shape = new Shape();
survolFond.graphics.beginFill(0xF3F3F3);
survolFond.graphics.drawRect(0, 0, 295, 120);
survolFond.graphics.endFill();
survol.addChild(survolFond);

var survolTexte:TextField = new TextField ();
survolTexte.width = 295;
survolTexte.height = 20;
survolTexte.y = 90;
survolTexte.defaultTextFormat = format ;
survolTexte.text = texte;
survol.addChild(survolTexte);
//////////////////////////////////////////////////////////////////////////
var clic:Sprite = new Sprite();

format.size = 14;

var clicTexte:TextField = new TextField ();

clicTexte.width = 295;
clicTexte.height = 20;
clicTexte.y = 90;
clicTexte.defaultTextFormat = format ;
clicTexte.text = texte;
clic.addChild(clicTexte);

var bouton:SimpleButton = new SimpleButton(repos, survol, clic, repos);
addChild (bouton);
}
}
}

#62 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 13 September 2015 - 13:51 PM

Voici le ficher .as

#63 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 13 September 2015 - 13:51 PM

.

Fichier(s) joint(s)

  • Fichier joint  Bouton.as   2.31 Ko   16 téléchargement(s)


#64 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 13 September 2015 - 22:12 PM

j'y suis presque, grace au code de monsieur Spi j'ai reussi a faire ce que je voulais :

var tab:Array = new Array("PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS");
var stockBoutons:Array; // tableau de stockage


stockBoutons = []

for(var i:uint = 0; i < tab.length; i++){
var bouton:Bouton = new Bouton(tab[i]);
bouton.x = 425 + (i*295);
bouton.addEventListener(MouseEvent.MOUSE_OVER, this["bt"+i]);
bouton.addEventListener(MouseEvent.CLICK, Click);
stockBoutons.push(bouton);
addChild(bouton);
}



function bt0(event:MouseEvent):void{
trace("Sous menu PLS");
}
function bt1(event:MouseEvent):void{
trace("Sous menu Carroussel");
}
function bt2(event:MouseEvent):void{
trace("Sous menu Tensionneurs");
}
function bt3(event:MouseEvent):void{
trace("Sous menu DollyBases");
}
function bt4(event:MouseEvent):void{
trace("Sous menu Winches");
}

function Click(event:MouseEvent):void{

removeChild(fond);
removeChild(logo);
stockBoutons[0].alpha = 0;
stockBoutons[0].alpha = 1;
stockBoutons[0].alpha = 2;
stockBoutons[0].alpha = 3;
stockBoutons[0].alpha = 4;

if (e.target.index == 0) {trace("Menu 0")}
if (e.target.index == 1) {trace("Menu 1")}
if (e.target.index == 2) {trace("Menu 2")}
if (e.target.index == 3) {trace("Menu 3")}
if (e.target.index == 4) {trace("Menu 4")}

}

seul probleme le compilateur ne sort une erreur, et me dit "acces a la proprieté e non defini " c'est le "e" du "e.target" .

#65 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 15 September 2015 - 22:04 PM

faut il importer une classe pour que le compilateur reconnaisse l'instruction "e.target.index" ?

#66 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 19:27 PM

Bonjour,

je suis toujours bloqué avec l'instruction "e.target.index" qui n'est pas reconnue par le compilateur ( acces a la proprieté "e" non defini ) quelqu'un a t il une idée ?

#67 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 25 September 2015 - 19:36 PM

Bonjour,

Tout vient de ta fonction :


function Click(event:MouseEvent):void
{

}
 

Lorsque tu déclare ta fonction, tu lui donne un nom, ici "Click", et un parametre d'entrée, ici "event:MouseEvent".
"event" est le nom du parametre et "MouseEvent" son type.

Donc si tu souhaite appeller ce parametre, tu dois l'appeller par son nom, donc ici "event" et non pas "e".
Comme ceci :


function Click(event:MouseEvent):void{
removeChild(fond);
removeChild(logo);
stockBoutons[0].alpha = 0;
stockBoutons[0].alpha = 1;
stockBoutons[0].alpha = 2;
stockBoutons[0].alpha = 3;
stockBoutons[0].alpha = 4;
if (event.target.index == 0) {trace("Menu 0")}
if (event.target.index == 1) {trace("Menu 1")}
if (event.target.index == 2) {trace("Menu 2")}
if (event.target.index == 3) {trace("Menu 3")}
if (event.target.index == 4) {trace("Menu 4")}
}
 

Ta confusion viens du fait que souvent, on nomme ca parametre "e" pour aller plus vite. Si tu veux qu'il s'appelle e, tu devras donc change le nom du parametre dans ton fonction, comme ceci :


function Click(e:MouseEvent):void{
removeChild(fond);
removeChild(logo);
stockBoutons[0].alpha = 0;
stockBoutons[0].alpha = 1;
stockBoutons[0].alpha = 2;
stockBoutons[0].alpha = 3;
stockBoutons[0].alpha = 4;
if (e.target.index == 0) {trace("Menu 0")}
if (e.target.index == 1) {trace("Menu 1")}
if (e.target.index == 2) {trace("Menu 2")}
if (e.target.index == 3) {trace("Menu 3")}
if (e.target.index == 4) {trace("Menu 4")}
}
 


#68 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 19:47 PM

Bonjour Draad,

Merci pour ta reponse, j'ai essayé un malheureusement je me prends un message d'erreur quand je clique sur un boutons et donc au déclenchement de la fonction Click , Il detecte une erreur sur la ligne if (e.target.index == 0) {trace("Menu 0")} Ou if (event.target.index == 0) {trace("Menu 0")}

message du compilateur "ReferenceError: Error #1069: Property index not found on flash.display.SimpleButton and there is no default value.
at Main_fla::MainTimeline/Click()[Main_fla.MainTimeline::frame1:69] "

et la ligne 69 c'est if (event.target.index == 0) {trace("Menu 0")}

#69 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:05 PM

J'ai tenté de remplacer le event.target.Index par

if (stockBoutons.index == 0) {trace("Menu 0")}
if (stockBoutons.index == 1) {trace("Menu 1")}
if (stockBoutons.index == 2) {trace("Menu 2")}
if (stockBoutons.index == 3) {trace("Menu 3")}
if (stockBoutons.index == 4) {trace("Menu 4")}

je n'ai plus d'erreur mais les boutons ne deviennent pas transparent et la fonction trace n'est jamais declenché ... je n'y compris rien

#70 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:08 PM

ok j'ai compris pour la transparence des boutons j'ai fait une correction mais toujours pas de fonction trace "Menu 0" "Menu 1" etc ...

function Click(e:MouseEvent):void{
removeChild(fond);
removeChild(logo);

if (stockBoutons.index == 0) {trace("Menu 0")}
if (stockBoutons.index == 1) {trace("Menu 1")}
if (stockBoutons.index == 2) {trace("Menu 2")}
if (stockBoutons.index == 3) {trace("Menu 3")}
if (stockBoutons.index == 4) {trace("Menu 4")}

stockBoutons[0].alpha = 0;
stockBoutons[1].alpha = 0;
stockBoutons[2].alpha = 0;
stockBoutons[3].alpha = 0;
stockBoutons[4].alpha = 0;

}

#71 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 25 September 2015 - 20:28 PM

A aucun moment tu ne defini l'index de tes boutons, c'est pour ca que tu as une erreur.
Essaye ça :


for(var i:uint = 0; i < tab.length; i++)
{
var bouton:Bouton = new Bouton(tab[i]);
bouton.x                = 425 + (i*295);
bouton.name = i;
bouton.addEventListener(MouseEvent.CLICK, Click);
stockBoutons.push(bouton);
addChild(bouton);
}

function Click(e:MouseEvent):void
{

   trace ("Click on Menu : " + e.target.name);
   e.target.alpha = 0;
}

 


#72 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:37 PM

Draad,

L'index de mes boutons ce fait automatique grace a ma boucle ainsi le premier bouton aura l'index 0 le deuxieme l'index 1 etc ... non ?

Sur ton script il y a un probleme sur cette instruction, car le compilateur s'arrete sur cette ligne ( contrainte implicite d'une valeur de typz Uint vers un type sans rapport String) : bouton.name = i;

#73 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:45 PM

je l'ai remplacer par cela
bouton.name = "Bouton"+i;

et ça fonctionne

#74 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:48 PM

par contre la fonction trace me renvoi ça : " Click on Menu : instance14 " pour le premier bouton et
" Click on Menu : instance24 "
" Click on Menu : instance34 "
" Click on Menu : instance44 " pour les autres .

Sais tu d'ou cela viens ?

#75 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 20:50 PM

Pourquoi n'ai je pas

Click on Menu : Bouton0
Click on Menu : Bouton1
Click on Menu : Bouton2
Click on Menu : Bouton3
et Click on Menu : Bouton4 ?

#76 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 25 September 2015 - 21:00 PM

Il faut pas tout mélanger, tes boutons ont l'index 0,1,2,3 ... seulement dans l'array stockBoutons !

Ainsi, si après ta boucle tu fais :
stockBoutons[0].alpha = 0.5;

Le bouton stocké a l'index 0 dans l'array "stockBoutons" devrait passer a 50% de transparence.

Désolé pour les petites erreurs dans mes exemples, je les ai écrits a la volée plus pour te donner une piste qu'une solution toute faite.
Voici une autre correction de mon code précédent, pareil a la volée donc j'ai pu faire des petites erreurs ;)


for(var i:int = 0; i < tab.length; i++)
{
var bouton:Bouton = new Bouton(tab[i]);
bouton.x                                = 425 + (i*295);
bouton.name = i.toString();
bouton.addEventListener(MouseEvent.CLICK, Click);
stockBoutons.push(bouton);
addChild(bouton);
}
function Click(e:MouseEvent):void
{
   trace ("Click on Menu : " + e.currentTarget.name);
   e.currentTarget.alpha = 0;
}
 


#77 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 21:12 PM

cela fonctionne mais j'ai deux questions, la 1er est que je ne comprends pas d'ou viens la valeur de la fonction trace, (Click on Menu : instance14 pour le premier bouton pourquoi "instance14" ? )

et deuxiemene j'aimerai pouvoir retrouver l'index du bouton pour afficher un sous menu ( different pour chaque bouton ) pour le moment le code etait :

if (stockBoutons.index == 0) {trace("Menu 0")}
if (stockBoutons.index == 1) {trace("Menu 1")}
if (stockBoutons.index == 2) {trace("Menu 2")}
if (stockBoutons.index == 3) {trace("Menu 3")}
if (stockBoutons.index == 4) {trace("Menu 4")}

mais j'ai l'intention de remplacer les trace menu0 , menu1 etc ... par des addChild, et ta fonction ne me le permet pas pour le moment a moins de comparer e.currentTarget.name a instance14, instance24, instance34, instance44 et instance 54 pour savoir sur quel bouton j'ai cliqué ... tu en pense quoi ?

#78 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 21:17 PM

ce code fonctionne, mais pourquoi la proprieté bouton.name s'appelle "instance14" ?

function Click(e:MouseEvent):void
{

trace ("Click on Menu : " + e.target.name);
e.target.alpha = 0;
if (e.target.name == "instance14") {trace("Menu 0")}
if (e.target.name == "instance24") {trace("Menu 1")}
if (e.target.name == "instance34") {trace("Menu 2")}
if (e.target.name == "instance44") {trace("Menu 3")}
}

#79 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 25 September 2015 - 22:12 PM

Si tu as bien observé mon second code, tu verra que j'ai remplacé la ligne


e.target.name
 

par


e.currentTarget.name
 


Pour comprendre, il faut que tu te penche sur ce que ta fonction fait réellement, et j'ai l'impression que, pour le moment, tu copie le code sans vraiment le comprendre.

Voici le code modifié pour ce que tu souhaite faire, avec des explications ajoutées. Note que j'ai supprimé le "stockArray" qui semble etre inutile.


var tab:Array = new Array("PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS");
for(var i:int = 0; i < tab.length; i++)
//Si "i" vaut 0 et tant que "i" est inférieur a la taille de "tab", appliquer les commandes suivantes, puis ajouter 1 a "i"
{
var bouton:Bouton = new Bouton(tab[i]);  // Créer une instance de la classe Bouton, et lui passer en parametre la valeur située a l'index "i" dans l'array "tab"

bouton.x = 425 + (i*295);       // déplacer l'instance bouton sur l'axe x

bouton.name = tab[i];            // affecter une valeur a la propiétée "name" de l'instance bouton

bouton.addEventListener(MouseEvent.CLICK, onClick);  // ajouter un écouteur d'evenement a l'instance bouton. Quand l'evenement "CLICK" est détécté sur le bouton, appeller la fonction qui se nomme "onClick"

addChild(bouton);  // ajouter le bouton a la scene
}
function onClick(e:MouseEvent):void
{
   trace ("Click on Menu : " + e.currentTarget.name);
   e.currentTarget.alpha = 0.5;
   switch (e.currentTarget.name)
   {
          case "PLS":
          trace ("Le bouton PLS a été cliqué, faire quelquechose");
          break;
          case "CARRUSSEL":
          trace ("Le bouton CARRUSSEL a été cliqué, faire quelquechose");
          break;
          default:
          trace ("Attention, un bouton a été cliqué, mais aucune case associée a son nom n'a encore été defini  ! ");
          break;
   }
}
 

Maintenant que se passe-t-il quand l'evenement MouseEvent.CLICK est détécté par flash ? (Je te suggere d'aller voir la doc ici.)

Un objet de la classe MouseEvent est créé sans que tu le sache avec plusieures informations. Comme la classe MouseEvent étends la classe Event, elle possède en plus de ses propres propriétées toutes les propritées de la classe Event. Parmis ces propriétées on trouve les suivantes :

type : le type d'event dont il s'agit
currentTarget : l'objet qui a déclenché l'evenement (ici ton bouton)

Comme tu as défini que lorsque flash detecte que ton bouton est la cible de l'evenement MouseEvent.Click, il doit appeller la fonction "onClick", ce dernier suit tes ordres et appelle la fonction "onClick" en lui passant en parametre cet objet dont nous venons de parler.

Comme dans cet objet il y a la propriétée "currentTarget" qui t'indique quel objet a déclenché l'evenement, et que tu as pris soin de définir la propriété "name" de ton bouton, il te suffit de regarder cette derniere pour savoir a quel bouton tu as affaire.



Le switch va évaluer chaque case jusqu'a en trouver une qui soit valide. Si aucune case n'est valide, il procedera au code placé dans la condition "default".

#80 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 22:48 PM

J'ai testé le code est la tout fonctionne, merci pour tes explications .
Non je ne fait pas de copier coller j'essaye quand meme de comprendre c'est juste que je ne connais pas certaines instructions, par exemple dans ton script joué avec cette instruction :
trace ("Click on Menu : " + e.currentTarget.name);
en la changeant par
trace ("Click on Menu : " + e.target.name);

et la effectivement dans le premier cas ça marche il recupere bien le nom du bouton grace a l'instruction bouton.name = tab[i];

et dans le deuxieme cas je me retrouve avec le fameux instance24, c'est surtout ça qui m'a derangé car je ne savait pas qu'il fallait utilise le E.CurrentTarget au lieu du E.target .

J'aimerai te demander autre chose si cela ne te derange pas, l'appli fonctionne bien le seul probleme c'est qu'une fois le bouton cliqué et que la proprieté .alpha vaut 0 on ne le voit plus a l'affichage le probleme c'est que mon pointeur de souris prends toujours la forme du main lorsque je suis au dessus .

alors j'ai essayer deux chose, la premiere c'est de le faire disparaître via l'instruction :
removeChild(e.currentTarget); mais la je me mange une erreur de compilation

la deuxieme c'est ça : e.currentTarget.buttonMode=false; pas d'erreur de compilation mais ça ne marche pas .

As tu une astuce, ou fonction pour permettre de palier a ce probleme ?

#81 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 23:04 PM

aussi j'ai du remettre le tableau "StockButton" car en realité je fait disparaître tous mes boutons si je clique sur l'un d'etre eux (je l'ai remis car impossible de récupérer l'instance du bouton et visiblement je dois passer soit par un container ou un tableau ) et par la suite afficherai un objet sur la scene via un addChild .

var tab:Array = new Array("PLS","CARRUSSEL","TENSIONADORES","DOLLYBASES","GUINCHOS");
var stockBoutons:Array; // tableau de stockage
stockBoutons = []

for(var i:int = 0; i < tab.length; i++)
//Si "i" vaut 0 et tant que "i" est inférieur a la taille de "tab", appliquer les commandes suivantes, puis ajouter 1 a "i"
{
var bouton:Bouton = new Bouton(tab[i]); // Créer une instance de la classe Bouton, et lui passer en parametre la valeur située a l'index "i" dans l'array "tab"

bouton.x = 425 + (i*295); // déplacer l'instance bouton sur l'axe x

bouton.name = tab[i]; // affecter une valeur a la propiétée "name" de l'instance bouton

bouton.addEventListener(MouseEvent.CLICK, onClick); // ajouter un écouteur d'evenement a l'instance bouton. Quand l'evenement "CLICK" est détécté sur le bouton, appeller la fonction qui se nomme "onClick"

stockBoutons.push(bouton);

addChild(bouton); // ajouter le bouton a la scene
}
function onClick(e:MouseEvent):void
{
trace ("Click on Menu : " + e.currentTarget.name);
stockBoutons[0].alpha = 0;
stockBoutons[1].alpha = 0;
stockBoutons[2].alpha = 0;
stockBoutons[3].alpha = 0;
stockBoutons[4].alpha = 0;

switch (e.currentTarget.name)
{
case "PLS":
trace ("Le bouton PLS a été cliqué, faire quelquechose");
break;
case "CARRUSSEL":
trace ("Le bouton CARRUSSEL a été cliqué, faire quelquechose");
break;
default:
trace ("Attention, un bouton a été cliqué, mais aucune case associée a son nom n'a encore été defini ! ");
break;
}
}


par contre le pointeur de la souris deviens toujours une main au passage des bouton invisibles, je me comprends pas pourquoi le .buttonMode ne fonctionne pas

#82 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 23:18 PM

j'ai testé ça, et la fonction OnClick n'est plus executé par contre j'ai toujours le pointeur de la souris qui prends la forme d'une main :

function onClick(e:MouseEvent):void
{
trace ("Click on Menu : " + e.currentTarget.name);
stockBoutons[0].alpha = 0;
stockBoutons[0].removeEventListener(MouseEvent.CLICK, onClick);
stockBoutons[1].alpha = 0;
stockBoutons[1].removeEventListener(MouseEvent.CLICK, onClick);
stockBoutons[2].alpha = 0;
stockBoutons[2].removeEventListener(MouseEvent.CLICK, onClick);
stockBoutons[3].alpha = 0;
stockBoutons[3].removeEventListener(MouseEvent.CLICK, onClick);
stockBoutons[4].alpha = 0;
stockBoutons[4].removeEventListener(MouseEvent.CLICK, onClick);
removeChild(logo);
removeChild(fond);

switch (e.currentTarget.name)
{
case "PLS":
trace ("Le bouton PLS a été cliqué, faire quelquechose");
break;
case "CARRUSSEL":
trace ("Le bouton CARRUSSEL a été cliqué, faire quelquechose");
break;
default:
trace ("Attention, un bouton a été cliqué, mais aucune case associée a son nom n'a encore été defini ! ");
break;
}
}

#83 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 25 September 2015 - 23:22 PM

Ouf !!! j'ai trouvé ça et ça fonctionne :

function onClick(e:MouseEvent):void
{
trace ("Click on Menu : " + e.currentTarget.name);
removeChild(stockBoutons[0]);
removeChild(stockBoutons[1]);
removeChild(stockBoutons[2]);
removeChild(stockBoutons[3]);
removeChild(stockBoutons[4]);
removeChild(logo);
removeChild(fond);

switch (e.currentTarget.name)
{
case "PLS":
trace ("Le bouton PLS a été cliqué, faire quelquechose");
break;
case "CARRUSSEL":
trace ("Le bouton CARRUSSEL a été cliqué, faire quelquechose");
break;
default:
trace ("Attention, un bouton a été cliqué, mais aucune case associée a son nom n'a encore été defini ! ");
break;
}
}

#84 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 25 September 2015 - 23:24 PM

Ha oui tu es tombé dans un piège ! Ce n'est pas parceque tu ne vois pas ton bouton qu'il n'existe pas . Mettre ton bouton.alpha = 0 le rends seulement totalement transaprent, il est donc toujours présent sur la scène et est déssiné par flash (oui il est déssiné invisible mais déssiné quand même).

Une option serait d'utiliser la propriété visible :
bouton.visible = false.
Là, ton bouton existe toujours dans le code mais n'est plus déssiné, il ne peut donc plus recevoir d'evenement. Par contre comme il existe toujours il utilise toujours une partie de la mémoire.

Une autre option, mais seulement si tu n'utilisera plus le bouton, c'est de le supprimer totalement, pour ca il faut retirer tous les ecouteurs que tu lui as associé et supprimer tous les pointeurs:

Vu que tu as stocké un pointeur dans l'array "stockBoutons", il faut aussi aller l'enlever, sinon ton bouton existera toujours en mémoire

for (var i:int = 0; i < stockBoutons.length; i++)
{
if (stockBoutons[i] == bouton)
{
stockBoutons[i] = null;
}
}
bouton.removeEventListener(MouseEvent.CLICK, onClick);
removeChild(bouton);
bouton = null;
 


#85 Yakub

    Ceinture Orange

  • Members
  • PipPipPip
  • 33 messages

Posté 26 September 2015 - 21:24 PM

draad,

Ton script fonctionne niquel, avec la boucle cela permets d'eviter d'ecrire autant de fois que de bouton l'instruction :
removeChild(stockBoutons[0]); de plus le fait d'avoir ajouter le comparateur if (stockBoutons[i] == bouton) cela va me permettre de rajouter d'autre objets a mon tableau sans que cela ne les affectent a conditions que ces objets ne soit pas des boutons si j'ai bien compris ... c'est pas mal comme idée

Par contre pourrais tu me dire me ce que fait l'instruction " =null " a la difference d'un removeChild ?
Je peux utiliser le removeChild sans forcement faire un removeEventListener (apparemment dans l'appli cela ne pose pas de probleme) ?

#86 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 653 messages

Posté 26 September 2015 - 22:48 PM

Citation

pourrais tu me dire me ce que fait l'instruction " =null " a la difference d'un removeChild ?

Comme expliqué dans mon précédent message, removeChild() va seulement retirer ton objet de la liste d'affichage, il existera toujours dans le code parceque il existe quelque part dans ton code une référence de ton objet. L'instruction "= null" permet de dire a flash, cette référence ne doit plus exister, la raison est que flash utilise ce qu'on appelle un Garbage Collector, c'est un petit programme dont tu n'as pas connaissance et qui tourne dans ton application. Une fois de temps en temps, le Garbage Collector va regarder l'état de ton application et décider de ce qui est encore utile ou pas.

Si quelque chose est utile, il le laisse tranquille.
Si quelque chose est inutile, il le détruit. Pourquoi ? Parceque cela libère de la mémoire et que la mémoire c'est précieux, si tu n'en a plus assez a un moment de ton application, ton application va s'arreter toute seule.

Pour se décider sur l'utilité d'un objet, le garbage collector va simplement regarder si cet objet possède une référence quelque part dans ton code.
Par exemple, quand tu fais :

stockBoutons.push(bouton);
 
En fait tu ne met pas ton bouton dans le tableau stockBoutons, tu y place seulement une référence !
Lorsque tu ajoute un eventListener, tu ne le sais peut-etre pas mais tu ajoute aussi une référence de ton objet.


Essaye ces deux codes :
Essai A : devrait faire planter ton application au bout d'un certain temps

var i : int = 0;
var stockBoutons : Array = []
addEventListener(Event.ENTER_FRAME, onEnterFrame)


private function onEnterFrame (e:Event):void
{
if (stockBoutons.length > 0)
{
var oldBouton : Bouton = stockBoutons[0];
removeChild(oldBouton);

stockBoutons = [];
}

i++;

var newBouton : Bouton = new Bouton (i.toString());
newBouton.addEventListener(MouseEvent.CLICK, onClick);
stockBoutons.push(newBouton);
addChild(newBouton);

trace ("J'ai créé " + i + " boutons et je stocke " + stockBoutons.length + " references dans mon array");
}

private function onClick (e:MouseEvent):void
{
trace ("Click");
}
 



Essai B : devrait pouvoir tourner des heures sans jamais planter.

var i : int = 0;
var stockBoutons : Array = []
addEventListener(Event.ENTER_FRAME, onEnterFrame)


private function onEnterFrame (e:Event):void
{
if (stockBoutons.length > 0)
{
var oldBouton : Bouton = stockBoutons[0];
removeChild(oldBouton);
oldBouton.removeEventListener(MouseEvent.CLICK, onClick);
oldBouton = null;


stockBoutons = [];
}

i++;

var newBouton : Bouton = new Bouton (i.toString());
newBouton.addEventListener(MouseEvent.CLICK, onClick);
stockBoutons.push(newBouton);
addChild(newBouton);

trace ("J'ai créé " + i + " boutons et je stocke " + stockBoutons.length + " references dans mon array");
}

private function onClick (e:MouseEvent):void
{
trace ("Click");
}
 


La seule différence c'est que dans le cas B, j'ai bien pensé a retirer toutes les références de mon bouton.
Il est donc important, lorsque tu es sur de ne plus avoir besoin d'un objet, de supprimer toutes ses références.


PS : Encore une fois le code a été écrit a la volée, il peut y avoir des erreurs.




Répondre à ce sujet



  

1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP