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