Forums Développement Multimédia

Aller au contenu

En réponse à Ecouteurs d'evenements sur un Sprite


Options du message

  • Anti-spam : un petit exercice
  ou Annuler


Résumé du sujet

draad

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 tranqu...

Yakub

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

draad

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

Yakub

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

Yakub

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":
tra...

Yakub

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"

Yakub

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

draad

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

Yakub

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

Yakub

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) {trac...

Voir le sujet complet (ouvre une nouvelle fenêtre)

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