En train de coder un gestionnaire de positionnement pour des clips sur la scène, je me vois confronté au problême bien connu du centrage des clips. En effet, les coordonnées _x et _y ne sont pas forcément celles du coin supérieur gauche du clip. Le canadien Stéphan Guénette s'est déjà penché sur cet épineux problême, et propose une solution bien pratique sur son blog ... 8)

Seulement, cette solution me pose quelques problêmes, tout d'abord parce qu'il s'agit d'une manipulation de prototypes, bien peu conseillée en AS2, et ensuite parce qu'à chaque accés à une propriété de positionnement, il s'effectue un appel à la méthode getBounds() ... Je ne me suis pas encore penché sur le second problême, mais concernant le premier, j'ai trouvé une petite astuce bien pratique pour accéder facilement aux propriétés d'un MovieClip membre d'une classe, et ce sans utiliser l'héritage.

Il s'agit en fait d'utiliser la méthode non documentée __resolve(), dont voici mon utilisation :dynamic class net.lalex.movieclip.SuperClip {
        // Clip ciblé
        private var _targetMC:MovieClip;
        // Constructeur
        public function SuperClip(mc:MovieClip) {
                _targetMC = mc;
        }
        // Redirige les requêtes non existantes vers le clip
        // contenu dans la propriété _targetMC
        public function __resolve(p:String) {
                // Si c'est une méthode, on l'applique au clip lui-même
                if (typeof _targetMC[p] == "function") {
                        return function() {
                                return _targetMC[p].apply(_targetMC, arguments);
                        }
                // Sinon, on retourne la propriété
                } else {
                        return _targetMC[p];
                }
        }
}
Comme vous le constatez, __resolve() permet d'intercepter les appels à des membres d'une classe qui n'existent pas, et d'en faire un peu ce que l'on veut. Le seul problême est que l'on ne peut pas accéder en écriture aux propriétés du clip. Comme il s'agit là d'une classe native, il faut donc ne pas oublier de créer les accesseurs pour modifier les propriétés (setX, setY, setRotation, etc...) ... mais si l'on s'en tient à l'utilisation des accesseurs pour la manipulation de propriétés lors du développement de classes "maisons", ce qui est bien plus conseillé en POO, cela fonctionne parfaitement ! :D Voici un exemple d'utilisation :import net.lalex.movieclip.SuperClip;
// Création de l'instance de SuperClip
var monClip:SuperClip = new SuperClip(_root.monCarre);
// Accés à une méthode du clip contenu dans monClip
// donc, une méthode de _root.monCarre
// Ici, il s'agit de mettre monCarre au dessus des tous les autres
monClip.swapDepths(monClip._parent.getNextHighestDepth());

Evidemment, ca tient tout autant de la bidouille que la solution avec les prototypes, mais je préfère malgré tout avoir une "vraie" classe ! :)