

#46
Posté 28 August 2015 - 07:29 AM
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 .
#48
Posté 31 August 2015 - 21:09 PM
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).
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é.
Tutoriels Javascript >> Pong - Taquin - Memory - Tic Tac Toe - Pendu - Snake - Proximity - Cascade - Démineur - Bejeweled - Tetris - Collisions -
Jeux perso >> Mes jeux
#49
Posté 05 September 2015 - 20:14 PM
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
Posté 05 September 2015 - 20:36 PM
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
Posté 07 September 2015 - 15:14 PM
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 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
Posté 09 September 2015 - 22:29 PM
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
Posté 10 September 2015 - 08:14 AM

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.
#56
Posté 12 September 2015 - 13:43 PM
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
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 ...
#59
Posté 12 September 2015 - 22:53 PM
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
Posté 13 September 2015 - 12:58 PM
) , donc sans aucun code et que la propriété 'nom' n'est pas renseignée
#61
Posté 13 September 2015 - 13:50 PM
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);
}
}
}
#64
Posté 13 September 2015 - 22:12 PM
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" .
#67
Posté 25 September 2015 - 19:36 PM
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
Posté 25 September 2015 - 19:47 PM
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
Posté 25 September 2015 - 20:05 PM
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
Posté 25 September 2015 - 20:08 PM
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
Posté 25 September 2015 - 20:28 PM
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
Posté 25 September 2015 - 20:37 PM
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;
#76
Posté 25 September 2015 - 21:00 PM
Ainsi, si après ta boucle tu fais :
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
Posté 25 September 2015 - 21:12 PM
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
Posté 25 September 2015 - 21:17 PM
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
Posté 25 September 2015 - 22:12 PM
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
Posté 25 September 2015 - 22:48 PM
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
Posté 25 September 2015 - 23:04 PM
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
Posté 25 September 2015 - 23:18 PM
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
Posté 25 September 2015 - 23:22 PM
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
Posté 25 September 2015 - 23:24 PM
Une option serait d'utiliser la propriété visible :
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
Posté 26 September 2015 - 21:24 PM
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
Posté 26 September 2015 - 22:48 PM
Citation
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);
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)