[Flash CS3/4] - TextField + Calque de masque + Tween, ca pue!
Par Laurent Deketelaere le mardi, mai 19 2009, 17:46 - Flash plateforme - Lien permanent
Comment passer un après-midi à ce prendre la tête!!!
A noter que ma réaction pourra être qualifié d'excessif, mais j'ai vraiment perdu l'habitude de bosser dans l'IDE.
- Pour commencer, prenez un projet où tous les éléments graphiques et les transitions sont montés dans un fla.
- Ensuite, décidez de rendre tous les blocs de textes dynamique (c'est beau une appli localisé). :p
- Et si vous avez de la chance vous tomberez sur ce magnifique bug (qui n'en est peut-être pas un aux yeux d'Adobe)?!
La situation est simple :
- Un MovieClip appelé «test» qui contient un champs de texte dynamique appelé «txt», qui contient comme texte par défaut «coucou».
- Placez ce MovieClip sur la scène, placez au dessus de lui un calque de masque.
- Appliquez une transition de forme sur ce masque. Wouai, trop cooool!!!
- Placez le code suivant sur la 1ère image clé.
var tf1:TextField = (getChildByName("test1") as MovieClip).getChildByName("txt") as TextField;
trace("tf1.text :: " + tf1.text);
tf1.text = "test 1";
trace("tf.text :: " + tf1.text);
- Compilez!
Magie, le deuxième trace retourne bien la valeur passé au champs de texte, par contre dans le swf on ne voit pas de changement?!
Après de minutieuses analyses, j'ai peux déclarer que : «A chaque image clé contenu dans la transition du masque, l'instance du MovieClip sur laquelle s'applique le masque est réinitialisée»!!!
Pour illustré cette découverte, un petit swf/fla qui contient 3 instances du MovieClip, le 1er n'est pas masqué, le 2e l'est via un calque de masque, le 3e l'est par un MovieClip qui lui est défini comme «mask» via actionscript. Les interpolations sont composé de 3 images clés, «start», «middle», «return». On peut voir que les modifications sont appliqué à tout le monde jusqu'à l'image clé «middle» qui va réinitialiser le champs 2.
Et en bonus un petit zip pour les curieux.
Vive Flash, vive l'IDE et vive Adobe!
[MAJ] - Suite aux commentaires de Sly et JeanPhi
Il semble que ça ne soit pas le fait de passer par de l'actionscript pour lier le masque qui règle le problème. Mais bien le fait d'utiliser un Shape comme masque.
Donc pour régler le problème, il suffit de convertir le Shape en MovieClip.
Commentaires
J'ai eu maintes fois ce genre de soucis, après pas mal de recherche la meilleure réponse que j'ai trouvé est "jamais de shape pour un masque, toujours mettre le shape dans un movieclip".
Si tu mets ton tween de shape dans un clip et que c'est ce clip qui est en masque tu n'auras plus de problème.
A savoir que ça peut sauver la vie car j'ai déjà eu des bugs de furieux qui pétaient tout le site (dans le code + visuellement) et impossible de trouver l'origine.
Jusqu'à que j'inspecte tous les masques de tout le projet et de m'apercevoir qu'il y en avait un avec un shape dans un masque (une simple rectangle) dès que j'ai "corrigé" pour en faire un clip plus aucun bug.
ouais c'est sûr, quand tu codes sur avec l'IDE, t'as d'autres reflexes de rangement.
Salut
En fait il faut prendre l'habitude de convertir les shape en symbole.
Sur Flash CS4, le problème ne se pose pas car il faut impérativement convertir la forme pour créer une interpolation.
Pas si on fait une interpolation de forme.
Mais je vais retenir ça pour la suite. D'ailleurs, ca serrait pas mal de rédiger une liste de bonne conduite pour les graphistes dans les fla.
Merci ! Tu viens de résoudre un bug que j'ai cherché pendant une journée complète !