Если у вас есть хороший контроль над тем, когда изменится высота любого данного спрайта, вы можете использовать пользовательское событие. Настройка будет выглядеть примерно так:
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();
Тогда просто убедитесь, что всякий раз, когда вы меняете высоту одного из ваших спрайтов, вы делаете что-то вроде этого:
mySprite.dispatchEvent(new Event(UPDATED_EVENT));
Если вы распределены по нескольким классам (а вам, вероятно, следует), то вы можете сделать строку UPDATED_EVENT константой в отдельном классе событий и получить к ней доступ из обоих.
Это все еще не идеальное решение для вас - если вы хотите, вы можете выяснить, какой спрайт меняет свою высоту и только пересчитать спрайты, которые идут после него, и это сделает ваш код более эффективным - но это лучше, чем вызов событие enterframe каждый раз.
Теперь, если бы вы использовали Flex, у вас было бы еще больше инструментов - вы, возможно, могли бы использовать привязку данных для автоматизации почти всего этого или, по крайней мере, использовать измененное событие, чтобы автоматически отправлять вам события, но это не так. ни здесь, ни там!