Как придерживаться позиции одного спрайта другому? - PullRequest
0 голосов
/ 15 сентября 2009

У меня есть следующий код:

if (i==0)
  sprites[i].y = 0;
else
  sprites[i].y = sprites[i-1].y + sprites[i-1].height; 

Каждый спрайт может иметь разную высоту. Высота спрайта может изменяться в зависимости от действий пользователя.

Когда изменяется высота некоторых спрайтов, я бы соответственно обновил положение других спрайтов.

Я ищу объектно-ориентированное (возможно, управляемое событиями) решение. Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 15 сентября 2009

нет способа полностью отслеживать изменения в x, y, width, height свойствах DisplayObject s ... вы можете переопределить методы доступа, но тем не менее это не совсем работает ... например, объект может стать больше, потому что добавлен дочерний элемент, что-то нарисовано, завершена некоторая операция загрузки и т. д. ...

если количество спрайтов достаточно низкое (<200), вы можете легко выполнить проверку на энтерфрейме без ощутимой потери производительности ... нет, это не очень хороший подход, но он действительно самый эффективный и самое безопасное занятие ... </p>

тогда удачи ...;)

1 голос
/ 17 сентября 2009

Если у вас есть хороший контроль над тем, когда изменится высота любого данного спрайта, вы можете использовать пользовательское событие. Настройка будет выглядеть примерно так:

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, у вас было бы еще больше инструментов - вы, возможно, могли бы использовать привязку данных для автоматизации почти всего этого или, по крайней мере, использовать измененное событие, чтобы автоматически отправлять вам события, но это не так. ни здесь, ни там!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...