removeMovieClip() et référence
Par Cédric Tabin le dimanche 09.03.2008, 23:06 - ActionScript - Lien permanent
Le ciblage des clips en AS2 est généralement la première source d'erreur chez les développeurs Flash. En lisant la mailing-list de flashcoders, un message a attiré mon attention sur le comportement bizarre que pouvait avoir removeMovieClip avec ses références.
Prenons le simple bout de code suivant :
var c1:MovieClip = this.createEmptyMovieClip("monClip", 0); c1.removeMovieClip(); this.createEmptyMovieClip("monClip", 1); c1._x = 150; // le nouveau clip "monClip" est déplacé !!!
Il est suprenant de constater que la dernière ligne de code affecte le nouveau clip créé ! Et cela a le même effet en utilisant la méthode attachMovie. Ce problème vient en fait du nom du clip qui, visiblement, est utilisé comme référence par flash pour la variable c1. Pour palier à cela, trois solutions existent :
- Utiliser l'opérateur 'delete' sur la variable c1
- Avoir un nom unique pour chacun des clips créés
- Réaffecter la variable c1 au clip nouvellement créé (mais le comportement restera le même)
Cela nous amène aux bouts de code suivants selon la solution choisie :
var c1:MovieClip = this.createEmptyMovieClip("monClip", 0); c1.removeMovieClip(); delete c1; this.createEmptyMovieClip("monClip", 1); c1._x = 150; // rien
var c1:MovieClip = this.createEmptyMovieClip("monClip", 0); c1.removeMovieClip(); this.createEmptyMovieClip("monClip2", 1); c1._x = 150; // rien
var c1:MovieClip = this.createEmptyMovieClip("monClip", 0); c1.removeMovieClip(); c1 = this.createEmptyMovieClip("monClip", 1); c1._x = 150; // clip déplacé (mais comportement correct)
Personnellement, j'utilise toujours des noms uniques pour la création de nouveaux clips et j'évite ainsi tous ce genre de soucis ! En ce qui concerne cela en AS3, le Flash Player génère une exception lors de l'accès à une propriété/méthode sur une valeur nulle, ce qui est très agréable lors du débuggage !
Pour ceux qui aimeraient approfondir, j'ai mis en annexe la source de démonstration du problème (Flash CS3).
Commentaires
Hello
Voilà un mauvais coup du garbage collector de l'AVM1 Heureusement qu'en AS3 de toute façon le moteur des displays n'est plus du tout le même ... donc moins de risque d'avoir ce type de soucis.
EKA+
Merci pour cet article qui devrait éviter une perte de temps pour beaucoup d'être nous...