AS3: Manipuler un clip de la racine depuis une autre classe

Résolu
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010 - 12 mai 2010 à 00:04
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010 - 17 mai 2010 à 21:22
Bonsoir,

Après avoir bidouillé un peu avec Flash MX2004 en AS2, je viens de passer à CS4 avec AS3... et j'ai vraiment du mal à faire propre.

Mon soucis, c'est que j'ai une classe dont l'une des propriétés est un MovieClip qui se ballade sur ma scène principale. Et j'aimerai tester si cet objet entre en contact avec un autre MovieClip XXX à coup de "HitTest", complètement indépendant de ma classe.
Le problème c'est que je ne trouve aucun moyen dans mon fichier .as d'accéder au MovieClip XXX sur la scène principale. Imitant le sale _root d'AS2, je tente un parent.XXX ou un stage.XXX, mais le compilateur m'envoie bouler en sous entendant qu'il est possible qu'il n'y ait pas de XXX (merci le compilo qui me dit: "il est possible qu'il y ait une erreur, dans le doute je compile pas" ). Je ne peux pas non plus passer le XXX en paramètre de mthode de mon objet, la fonction qui va faire le HitTest est appelée par un eventListener. J'ai bien cru trouver la solution ici: http://www.flashkod.com/codes/COMMUNICATION-CLIP-CLIP-AS3_49743.aspx , mais je n'ai pas compris en quoi ses clips communiquaient à part par événements.
Enfin, j'aimerai vraiment éviter de piloter ce HitTest depuis ma scène principale parce qu'il va y avoir beaucoup d'objets qui vont se bousculer (donc des listes à gérer s'il faut passer par là), alors s'ils pouvaient se débrouiller tous seuls, ça serait mieux.

Merci de m'avoir lu en tout cas.

PS: en question bonux gratuite, y'a vraiment plus moyen d'avoir une doc aussi claire et simple d'utilisation avec CS4 qu'avec les version antérieures? Juste un truc où je tape un nom de fonctio net j'ai la description détaillée comme au bon vieux temps? Je trouve tout et n'importe quoi sauf ce que j'aimerai avec http://help.adobe.com/fr_FR/Flash/10.0_Welcome/ .

7 réponses

dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
14 mai 2010 à 09:42
ok

visiblement, il tente de récupérer le mc "marine" directement depuis stage. Ce qu'il n'y arrivera pas car Stage contient déjà la scène principale en 1er lieu.

Fais le test avec ceci, tu comprendras bien :
trace(stage.getChildAt(0));

Il t'affichera en sortie "[object MainTimeline]" -> on a donc récupéré notre scène principale.

Ensuite on veut récupérer le mc "marine" affichée sur la scène principale.
Or la propriété "marine" n'existe pas sur MainTimeline. Il faut donc "caster" l'objet MainTimeline en MovieClip, ce qui aura effet de lui indiquer en quel type il doit le traiter. On veut MovieClip, car c'est une classe dynamique et elle peut avoir n'importe quoi en propriété.

Voilà donc notre code :
trace(MovieClip(stage.getChildAt(0)).marine);


Bon par contre, c'est un peu "bidouille" car on passe par stage, c'est mieux de passer par parent ^^.
3
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
12 mai 2010 à 12:10
Salut,

2 pistes :
- ta classe que tu utilises est-elle bien affichée sur ta scène ?
- as-tu activé le débogage dans les paramètres de publication, afin d'avoir des messages du compilo plus clairs.

Ensuite cela dépend encore de 2 choses :
- Ta classe correspond-elle à la classe du document, donc celle héritée directement de "root" ? et dans ce cas tu peux accéder aux objets graphiques placés sur ta scène directement dès le constructeur.
- Si ta classe est séparée puis déstiné à être affichée sur la scène, il faut bien faire attention de ne pas tenter d'accéder au root dans le constructeur, car tant que l'objet n'est pas compris dans la displaylist, il ne peut en aucun cas accéder à ses parents.
Dans ce cas, il faut déclarer un addEventListener(Event.ADDED, onAddedToStage) dans le constructeur, et la fonction onAddedToStage est déclenché dès que l'objet est ajouté à la displayList.

ps : pour ta question bonus, c'est comme tu veux mais je ne saurais que te conseiller que de rétrograder de version à la CS3, bien plus stable, moins beugée et moins pompeuse. De plus pour la doc, il ne va pas te la chercher en ligne mais t'ouvre le panel d'aide comme tu aurais pu l'avoir avec as2.
La preuve que CS4, c'est du ADAUBE. http://www.envrac.org/index.php/Flash-cs4-pros-cons, perso je n'ai pas acquéris la CS4, et j'attends la CS5 qui semble se rattraper..
0
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010
12 mai 2010 à 15:09
Merci du conseil de downgrade vers CS3, je crois que c'est ce que je vais faire tellement l'aide me manque.
Et je vais chercher cette histoire de débugage dans les paramètres de publication, je n'avais pas vu.

Sinon pour tes questions:
oui ma classe s'affiche, tout marche apparemment, c'est juste que je n'arrive pas vraiment à manipuler mon movieclip Z qui est sur la scène.

En me relisant, je m'aperçois que je ne suis pas clair du tout (surement qu'après 2h de prise de tête à minuit, je peux être excusé), donc je vais rentrer plus précisément dans mon problème:

J'ai une scène avec un movieClip XXX. Lui, il sera toujours existant, je suis sûr de son existence.
A côté de ça, j'ai une classe dans un fichier ClassYYY.as à part qui "pilote" sur la même scène un movieclip YYY (YYY est une propriété de ClassYYY, donc pas de soucis pour lui).
Mes fichiers communiquent bien, tout va nickel, mais le problème c'est:
Dans ma classe ClassYYY, j'ai une fonction déclenchée par un eventListener donc, je ne peux pas passer de paramètre à cette fonction. Mais dans cette fonction, j'aimerai tester la collision entre YYY et XXX... Comment je fais donc pour accéder à XXX ?

J'ai cru lire que mon seul salut reposait sur le fait de créer ma propre classe d'evénement pour transmettre XXX dans mon événement, mais ça me semble trèèèès sale, autant que je code tout à la racine du doc si c'est pour faire ça :(

Voilà, peut être est-ce plus clair, et merci encore dj ouf, je regarde le mode débugage ce soir en rentrant ;)
0
dj_ouf Messages postés 221 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 6 septembre 2011
12 mai 2010 à 16:08
Oky, merci pour ces précisions.

Le mieux je pense est que tu puisses accéder à la scène principale par le biais de ta classeYYY.as, car avec la racine, tu accèdes sans aucuns soucis à ses enfants.
Donc la question est : comment accéder à cette scène principale ?
Tu as affirmé au-dessus :
Imitant le sale _root d'AS2, je tente un parent.XXX ou un stage.XXX

Cela me semble pourtant être la bonne méthode. Pour t'aider à savoir ce qui fait planter l'exécution, j'aurais besoin de savoir où se situe cette classe dans la liste d'affichage :
- soit c'est la classe du document, donc le point d'entrée.
- la classe est instanciée est affichée depuis le scénario principale
- ou alors est-ce que c'est la classe associée à un symbole de la bibliothèque, qui est placé sur la scène ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010
12 mai 2010 à 19:25
Je crois que c'est le deuxième cas, ou ptet le troisième:
YYY est instanciée dans le scénario principal en copiant un MovieClip de la bibliothèque, voilà le code de la fonction que j'utilise sur le scénario principal:

function duplicateClip(aDupe:MovieClip):MovieClip
{
var targetClass:Class = Object(aDupe).constructor;
var duplicate:MovieClip = new targetClass();
addChild(duplicate);
return(duplicate);
}


Ensuite, il est simplement associé à un objet de type ClassYYY en faisant monInstanceClassYYY.monClip = YYY; (sachant que monClip est une propriété de ClassYYY).

ET à chaque fois que je tente parent.XXX ou stage.XXX dans mon code de la ClassYYY, le compilo m'indique "1119: Accès à la propriété Marine peut-être non définie, via la référence de type static flash.display:Stage."
0
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010
12 mai 2010 à 19:27
Vu que j'ai fait un copier-coller violent: Marine dont parle le compilo c'est le clip XXX depuis le début :)
0
Feizenbara Messages postés 5 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 mai 2010
17 mai 2010 à 21:22
>>> trace(MovieClip(stage.getChildAt(0)).marine);

J'ai envie de dire: Alleluia ça marche comme sur des roulettes.

Il me manquait donc un niveau d'abstraction et un cast.
Je vais me débrouiller comme ça, même si effectivement c'est de la bidouille, mais c'est bien mieux que ce que j'aurai fini par faire sinon.


Merci mille fois pour ce coup de main en tout cas!
0
Rejoignez-nous