Si vous avez un bon contrôle sur le moment où la hauteur d'un sprite donné va changer, vous pouvez 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, vous faites quelque chose comme ceci :
mySprite.dispatchEvent(new Event(UPDATED_EVENT));
Si vous êtes répartis dans plusieurs classes (et c'est probablement le cas), vous pouvez faire de la chaîne UPDATED_EVENT une constante dans une classe d'événement distincte 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 de hauteur et ne recalculer que les sprites qui viennent après lui, ce qui rendra votre code plus efficace - mais c'est mieux que d'appeler un événement enterframe à chaque fois.
Si vous utilisiez Flex, vous auriez encore plus d'outils à votre disposition - vous pourriez probablement utiliser le databinding pour automatiser presque tout cela, ou au moins utiliser l'événement changed pour distribuer automatiquement des événements pour vous, mais ce n'est ni l'un ni l'autre !