Aide - Recherche - Membres - Calendrier
Version complète : Des clips dans un tableau
Centre de Formation Flash - Forums Adobe Flash > Adobe Flash > Programmation Actionscript > Actionscript 3
ARROWPHIL
Bonjour
J'ai une classe qui est attaché à un movieClip appeler "menu" la classe porte le même nom "Menu".
Dans la classe Menu, j'aimerais intégrer dans un tableau le 4 boutons (ou plutôt leur nom d'instance) qui sont posés sur la scène :

Action Script


var montableau:Array = new Array ("bouton1", "bouton2", "bouton3", "bouton4")


Avec une boucle for j'aimerais récupérer ces occurrences et ainsi ajouter un écouteur sur chaque clip.

Action Script


for (var i:int = 0; i< montableau.length; i++){
montableau[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOver)
}


Mais comme vous vous en doutez, ça ne fonctionne pas !
L'un de vous pourrait-il m'expliquer ce que j'ai loupé ?

A+
stealth35
Citation (ARROWPHIL @ Dec 2 2008, 06:19 PM) *
Bonjour
J'ai une classe qui est attaché à un movieClip appeler "menu" la classe porte le même nom "Menu".
Dans la classe Menu, j'aimerais intégrer dans un tableau le 4 boutons (ou plutôt leur nom d'instance) qui sont posés sur la scène :

Action Script


var montableau:Array = new Array ("bouton1", "bouton2", "bouton3", "bouton4")


Avec une boucle for j'aimerais récupérer ces occurrences et ainsi ajouter un écouteur sur chaque clip.

Action Script


for (var i:int = 0; i< montableau.length; i++){
montableau[i].addEventListener(MouseEvent.MOUSE_OVER, mouseOver)
}


Mais comme vous vous en doutez, ça ne fonctionne pas !
L'un de vous pourrait-il m'expliquer ce que j'ai loupé ?

A+


Action Script

 this[montableau[i]].addEventListener(MouseEvent.MOUSE_OVER, mouseOver)


ou

Action Script


var montableau:Array = new Array (this["bouton1"], this["bouton2"], this["bouton3"], this["bouton4"])

ARROWPHIL
Citation (stealth35 @ Dec 2 2008, 06:23 PM) *

Action Script

 this[montableau[i]].addEventListener(MouseEvent.MOUSE_OVER, mouseOver)


ou

Action Script


var montableau:Array = new Array (this["bouton1"], this["bouton2"], this["bouton3"], this["bouton4"])

Thanks
C'est marrant en AS2 c'est truc qui me posait pas de problème et en AS3 y a toujours un truc qui m'échappe !

Merci du tuyau !

A+
stealth35
Citation (ARROWPHIL @ Dec 2 2008, 06:30 PM) *
Thanks
C'est marrant en AS2 c'est truc qui me posait pas de problème et en AS3 y a toujours un truc qui m'échappe !

Merci du tuyau !

A+



ouai moi c'etait pareil au debut, je captai pa non plus avant je faisais

a = 1
b = 2
trace(a + b)

apres en as3

c'est

var a:Number = 1
var b:Number = 2

trace(a + b)


sous as3 tout est typé enfaite
ARROWPHIL
Citation (stealth35 @ Dec 2 2008, 06:37 PM) *
ouai moi c'etait pareil au debut, je captai pa non plus avant je faisais

a = 1
b = 2
trace(a + b)

apres en as3

c'est

var a:Number = 1
var b:Number = 2

trace(a + b)
sous as3 tout est typé enfaite

Ha ouais, non c'est même pas le typage qui m'ennuie (j'avais commencer à prendre de bonnes habitudes en AS2 sur les conseils d'un MEDIABOXEUR) mais c'est plus le coup d'avoir un tableau avec des valeurs en "String" dedans (pas le sous vêtement !) et de réutiliser ces valeurs pour appeler un MovieClip dont le nom d'occurrence est aussi ce "String".
Enfin je sais pas si je suis très claire, c'est la fin de journée - Désolé. icon_mrgreen.gif

A+
tibibi
Citation (ARROWPHIL @ Dec 2 2008, 06:49 PM) *
Ha ouais, non c'est même pas le typage qui m'ennuie (j'avais commencer à prendre de bonnes habitudes en AS2 sur les conseils d'un MEDIABOXEUR) mais c'est plus le coup d'avoir un tableau avec des valeurs en "String" dedans (pas le sous vêtement !) et de réutiliser ces valeurs pour appeler un MovieClip dont le nom d'occurrence est aussi ce "String".
Enfin je sais pas si je suis très claire, c'est la fin de journée - Désolé. icon_mrgreen.gif

A+


Bonjour à tous,

C'est pour cela que j'utilise le getChildByName icon_biggrin.gif this.[""] ça fais pas très propre je trouve. Mais ce n'est que mon avis icon_razz.gif

++icon_wink.gif
stealth35
Citation (ARROWPHIL @ Dec 2 2008, 06:49 PM) *
Ha ouais, non c'est même pas le typage qui m'ennuie (j'avais commencer à prendre de bonnes habitudes en AS2 sur les conseils d'un MEDIABOXEUR) mais c'est plus le coup d'avoir un tableau avec des valeurs en "String" dedans (pas le sous vêtement !) et de réutiliser ces valeurs pour appeler un MovieClip dont le nom d'occurrence est aussi ce "String".
Enfin je sais pas si je suis très claire, c'est la fin de journée - Désolé. icon_mrgreen.gif

A+


justement enfaite vu que c'est programmation objet

c'est :

object.addEventListener

ça que tu mettais c'était

"bouton 1".addEventListener

t'ajoutais un écouteur a un object string en gros, alors que toi tu veux récupéré le MovieClip, qui est this["bouton 1"]
Logic
110% d'accrod avec Tibibi, plus clean et plus AS3 d'utiliser le getChildByName.

D'ailleurs en passant, les String (pas le sous-vêtement) que tu as mis dans ton tableau, ce ne sont pas les noms d'instance de tes clips, mais des affectations à name + des propriétés dynamiques crées par l'IDE.

Je m'explique:

Quand tu nommes un clip sur ta scène, à la compilation cela a 2 effets:

1: cela remplit la propriété name de ton clip. Ton clip devient alors ciblable par un getChildByName sur son parent.

2: cela ajoute aussi une propriété dynamique au clip qui le contient (son parent donc), rendant alors possible la syntaxe monClip["monSousClip"]. Ce comportement est un vestige de l'AS2 et la syntaxe monClip["monSousClip"] devrait être absolument évitée. Attention, si je te dis ça c'est pas pour le vent, car le jour où tu feras un addChild par code, tu ne pourras pas cibler ton clip par cette syntaxe, tu devras obligatoirement passer par une méthode style getChild.

Faut bien être conscient de ça. En AS2, enfant et propriété dynamique sur un MovieClip était 2 concepts inextricables. Ce n'est plus le cas en AS3. J'aurai été ingé chez Adobe, j'aurai carrément dégagé la création de la propriété dynamique, ça aurait été plus clair et ça n'aurait induit personne en erreur.

Aujourd'hui t'as encore des débutants qui suite à des addChld par code se plaignent de pas pouvoir récupérer leur clips avec la syntaxe monClip["monSousClip"], et forcément ils comprennent pas puisqu'avec des clips créés dans l'IDE, ça marche...
Logic
Note: il me semble d'ailleurs que l'option de création des propriétés dynamiques par l'IDE est désactivable. Genre une coche dans les options styles "déclarer automatiquement les MovieClip sur la scène".
dada
Citation (Logic @ Dec 2 2008, 08:01 PM) *
Note: il me semble d'ailleurs que l'option de création des propriétés dynamiques par l'IDE est désactivable. Genre une coche dans les options styles "déclarer automatiquement les MovieClip sur la scène".

C'est en rapport avec les classes liées à des clips ou au root (classe Document). Si on le décoche, on doit déclarer en var publique les noms d'occurence des symboles posés dans le symbole lié (ce que je trouve préférable).

Sinon, pour la question de ARROWPHIL, pourquoi passer par des String ?
Le titre du sujet c'est bien "Des clips dans un tableau", pas "Des noms de clips dans un tableau". icon_razz.gif
C'est plus simple et rapide d'utiliser des références.

Action Script

var montableau:Array = new Array (bouton1, bouton2, bouton3, bouton4);
for each (var clip:MovieClip in montableau){
clip.addEventListener(MouseEvent.MOUSE_OVER, mouseOver)
}


Et je dirais même plus qu'en utilisant le bubbling, on n'a pas besoin de boucle. smile.gif

Action Script

leConteneurDeMesClips.addEventListener ( MouseEvent.MOUSE_OVER, mouseOver);

Sauf si c'est ROLL_OVER que tu souhaites utiliser, qui lui n'utilise pas la propagation.
ARROWPHIL
Citation (Logic @ Dec 2 2008, 07:57 PM) *
Aujourd'hui t'as encore des débutants qui suite à des addChld par code se plaignent de pas pouvoir récupérer leur clips avec la syntaxe monClip["monSousClip"], et forcément ils comprennent pas puisqu'avec des clips créés dans l'IDE, ça marche...

Hé ben voilà c'est exactement ça, j'ai testé dans l'IDE et ça fonctionnait mais effectivement dans la classe, il voulait pas !
ARROWPHIL
Citation (dada @ Dec 2 2008, 08:27 PM) *
C'est en rapport avec les classes liées à des clips ou au root (classe Document). Si on le décoche, on doit déclarer en var publique les noms d'occurence des symboles posés dans le symbole lié (ce que je trouve préférable).

Sinon, pour la question de ARROWPHIL, pourquoi passer par des String ?
Le titre du sujet c'est bien "Des clips dans un tableau", pas "Des noms de clips dans un tableau". icon_razz.gif
C'est plus simple et rapide d'utiliser des références.

Action Script

var montableau:Array = new Array (bouton1, bouton2, bouton3, bouton4);
for each (var clip:MovieClip in montableau){
clip.addEventListener(MouseEvent.MOUSE_OVER, mouseOver)
}


Et je dirais même plus qu'en utilisant le bubbling, on n'a pas besoin de boucle. smile.gif

Action Script

leConteneurDeMesClips.addEventListener ( MouseEvent.MOUSE_OVER, mouseOver);

Sauf si c'est ROLL_OVER que tu souhaites utiliser, qui lui n'utilise pas la propagation.


Vous êtes trop fort les gars wink.gif, je me suis couché avec ce problème en tête (du coup 1H pour m'endormir) et hop je me lève, et qu'est ce que m'on préparé mes mediaboxeurs adorés, trois belles réponses claires et concises (la magie de noël ?) - Nikel pour commencer la journée avec le sourire ! Merci bien les gars, toute ces histoires de String ça a tendance à m'énerver un peu en fin de journée !! wink.gif

A++
wips
Salut.
Je remonte le post car le sujet est similaire:
J'ai un MC "menu" que je place dynamiquement sur la scène. Dans ce menu, plusieurs occurences de mc avec un nom typé dans la p'tite case, genre btn1, btn2...
voilà ce que je cherche à faire:

Action Script


menu.addEventListener(MouseEvent.MOUSE_OVER, _menuOver, true)

private function _menuOver (evt:MouseEvent):void
{
var btnName:String = evt.target.name
trace(btnName);
};

Mais en sortie, il me sort quand même "instance75", "instance81", etc...
Que faut-il faire pour retrouver la propriété .name de mes occurrences?

Merci d'avance.

(P.S: la réponse est peut-être ici, mais si c'est le cas, j'avoue qu'elle ne me saute pas aux yeux...)
wips
Autant pour moi:
Ca me ciblait un sous-movieClip placé dans chaque instance... Le bon truc était evt.target.parent.name
Sorry
monz
Citation (wips @ Dec 9 2008, 12:36 PM) *
Salut.
Je remonte le post car le sujet est similaire:
J'ai un MC "menu" que je place dynamiquement sur la scène. Dans ce menu, plusieurs occurences de mc avec un nom typé dans la p'tite case, genre btn1, btn2...
voilà ce que je cherche à faire:

Action Script


menu.addEventListener(MouseEvent.MOUSE_OVER, _menuOver, true)

private function _menuOver (evt:MouseEvent):void
{
var btnName:String = evt.target.name
trace(btnName);
};

Mais en sortie, il me sort quand même "instance75", "instance81", etc...
Que faut-il faire pour retrouver la propriété .name de mes occurrences?

Merci d'avance.

(P.S: la réponse est peut-être ici, mais si c'est le cas, j'avoue qu'elle ne me saute pas aux yeux...)


Salut, je n'arrive pas à reproduire ton pb.
J'ai créé un clip sur lequel je mets mes btn1, btn2, etc.
J'importe ce clip dynamiquement sur ma scène et ton script renvoie bien bnt1,btn2...

Tu pourrais nous en dire plus sur ton code...

EDIT : je préfère
Logic
Salut.

Bon à savoir:

- sur un Event, target désigne qui est à l'initiative de l'évènement levé. Dans le cas d'un MouseEvent, ce sera le plus jeune enfant où a eu lieu l'interaction (donc le sous-sous-sous...-sous clip de ton bouton)

- sur un Event, currentTarget désigne qui a levé l'évènement. C'est l'objet sur lequel le addEventListener a été ajouté.

En regardant target, tu ne sais pas trop à qui tu accèdes (si tu ajoutes des imbrications de clips dans tes boutons, ton ciblage avec parent va tomber à l'eau). En utilisant currentTarget, tu es sûr de qui tu as sous la main. Moralité, mets donc des écouteurs sur tes boutons plutôt que sur ton menu et joue avec le currentTarget.
wips
Tu n'as pas tort en effet... Mais j'ai fait ça parce que dernièrement je suis tombé sur un bout de code qui le faisais, et je me suis dit " pas con, ca va m'économiser un max d'eventListener".
Il y a aussi la solution de faire une classe commune à tout mes boutons, et de jouer effectivement avec le currentTarget...
Ah la la, le dev alors: 30 000 de solutions pour un problème...
dada
Il existe une autre solution, c'est d'utiliser le target (permettant de n'avoir un listener que sur le conteneur) et de mettre mouseChildren=false sur chacun des objets. smile.gif
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.