Si vous avez un bon contrôle lorsque la hauteur d'un sprite va changer, vous pouvez alors utiliser un événement personnalisé. La configuration ressemblerait à quelque chose comme ceci:
var UPDATED_EVENT:String = "updated";
var i:int = 0;
var count:int = sprites.length; // this is the length of your array
for (i = 0; i < count; i++) {
sprites[i].addEventListener(UPDATED_EVENT, calc);
}
function calc(e:Event = null):void {
// here goes your positioning code
for (i = 0; i < count; i++) {
if (i==0)
sprites[i].y = 0;
else
sprites[i].y = sprites[i-1].y + sprites[i-1].height;
}
}
calc();
Ensuite, assurez-vous que chaque fois que vous changez la hauteur d'un de vos sprites que vous faites quelque chose comme ceci:
mySprite.dispatchEvent(new Event(UPDATED_EVENT));
Si vous étalez sur plusieurs classes (et vous devriez probablement l'être) alors vous pouvez faire de la chaîne UPDATED_EVENT un const dans une classe d'événements séparée et y accéder à partir des deux. Ce n'est toujours pas une solution parfaite pour vous - si vous le souhaitez, vous pouvez déterminer quel sprite change sa hauteur et ne recalculer que les sprites qui le suivent, ce qui rendra votre code plus efficace - mais ça bat appeler un événement enterframe à chaque fois. Maintenant, si vous utilisiez Flex, vous auriez encore plus d'outils à votre disposition - vous pourriez probablement utiliser la liaison de données pour automatiser presque tout cela, ou au moins utiliser l'événement modifié pour distribuer automatiquement les événements pour vous, mais c'est ni ici ni là!
1. essayez 'fonction calc (e: Événement = null) {var y: Number = 0; pour chaque (var s: Sprite dans les sprites) y = (s.y = y) + s.height; } '. c'est plus rapide (pas d'accès au tableau) et plus concis. 2. ce n'est pas toujours plus efficace. Si vos sprites changent beaucoup (plusieurs fois par image), vous appelerez 'calc' plus souvent que nécessaire et instancierez plus d'événements que nécessaire. De plus, cela est très peu flexible, car tout code accédant à ces sprites doit se soucier des mises à jour. Ceci est tout à fait contraire aux concepts OO. – back2dos
Cool feedback, et bon appel sur l'utilisation de la pour chaque boucle plutôt que l'accès au tableau. En ce qui concerne les principes OO, vous avez raison - de la façon dont je l'ai exposé, vous allez avoir un couplage serré en cours.Vous devriez être capable de le refactoriser dans un arrangement un peu plus abstrait, mais sans un événement CHANGÉ comme Flex vous êtes toujours bloqué en envoyant manuellement UPDATED_EVENT chaque fois que quelque chose change. – Myk
bonne réponse! dommage que je l'ai déjà fait avec ENTER_FRAME – warpech