обнаружение изменений в расположении спрайта - PullRequest
1 голос
/ 22 октября 2009

Какова хорошая стратегия для обнаружения, когда позиция (x, y) спрайта относительно сцены изменилась? Другими словами, как я могу обнаружить изменения в глобальной позиции спрайта?

Это становится трудным, когда спрайт является дочерним по отношению к другим объектам DisplayObjectContainer.

Ответы [ 7 ]

1 голос
/ 27 октября 2009

Я могу думать только о том, чтобы вызывать функцию для события EnterFrame и проверять координаты lacalToGloabal, проверенные по сохраненному свойству. Проблема в том, что это может стать довольно ресурсоемким, если у вас много спрайтов. Вы можете решить проблему, включив и отключив обработчик событий на основе внешних условий. В противном случае я бы действительно решил обсудить проблему наоборот и сосредоточиться на обстоятельствах, которые могут перемещать спрайтов, то есть на триггеры, а не на эффекты, если это возможно.

1 голос
/ 09 февраля 2011

Просто была такая же проблема.

Я написал менеджера, который слушает события перемещения всех предков и обновляет слушателей при добавлении / удалении со сцены. Он отправляет GlobalMoveEvent с координатами этапа x / y рассматриваемого компонента.

В настоящее время он работает только для компонентов UIComponents, но предназначен для расширения до Sprite и т. Д.

Дайте мне знать, если вы заинтересованы.

1 голос
/ 22 октября 2009

Если вы действительно хотите это и хотите, чтобы оно было точным, создайте onEnterFrame и вложите в него что-то подобное:

var vals:Object = new Object;
function checkPositionChanged(obj:DisplayObject):Boolean
{
var bool:Boolean = false;

var pt:Point = new Point(obj.x,obj.y);
pt = pt.localToGlobal(obj);
if( vals.x != pt.x || vals.y != pt.y ){
   bool = true;
}
vals.x = pt.x;
vals.y = pt.y;
return bool;
}
1 голос
/ 22 октября 2009

Вы можете создать подкласс Sprite и переопределить public function set x(value:Number):void и public function set y(value:Number):void

простой пример:

public class Exemple extends Sprite{

    override public function set x(value:Number):void{
         super.x=value;
         dispatchEvent(new Event("move"));
    }
    override public function set y(value:Number):void{
         super.y=value;
         dispatchEvent(new Event("move"));
    }

}

Также посмотрите на событие Event.RENDER ...

1 голос
/ 22 октября 2009

Это UIComponent или просто Sprite? Я не уверен, как это сделать, если это просто Sprite, но если это UIComponent, это выполнимо, но может запутаться.

Вам нужно будет прослушать событие move компонента. Получив это событие, вы можете получить его положение и преобразовать его в глобальные координаты, используя метод localToGlobal () .

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

Возможно, есть более чистый способ сделать это, но если нет, то это должно сработать.

0 голосов
/ 22 октября 2009

Вы можете сделать это на основе модификации предложения OXMO456. Поскольку вас беспокоят уведомления, основанные на их положении на сцене, а не на том, что они являются родителями, вы можете просто кэшировать и сравнивать «глобальные» координаты и запускать их при изменении.

полезных способов узнать:

localToGlobal

globalToLocal

public class Example extends Sprite{
    private var stagePoint:Point = new Point(0,0);
    override public function set x(value:Number):void{
        super.x=value;
        if(stage != null){
            var globalPoint:Point = this.parent.localToGlobal(new Point(x,y));
            if(globalPoint.x != stagePoint.x){
                stagePoint = globalPoint;
                dispatchEvent(new Event("move"));
            }
        }
    }
    override public function set y(value:Number):void{
         super.y=value;
         if(stage != null){
            var globalPoint:Point = this.parent.localToGlobal(new Point(x,y));
            if(globalPoint.y != stagePoint.y){
                stagePoint = globalPoint;
                dispatchEvent(new Event("move"));
            }
        }
    }

}

РЕДАКТИРОВАТЬ: Ой, подождите, я думаю, что я неправильно истолковал то, что вы просили, дох! Я оставлю это на всякий случай, если это пригодится другим способом.

Не могли бы вы рассказать подробнее о проблеме, которую вы пытаетесь решить, выполнив это? Это может помочь нам сосредоточиться на решении, которое будет работать без накладных расходов (например, тонна зарегистрированных слушателей событий или что-то подобное)

0 голосов
/ 22 октября 2009

Другим решением будет создание «нити» с использованием Таймер для проверки позиции с использованием localToGlobal() каждые, скажем, 100 мс. Между перемещением и получением события будет задержка, но в этом случае вам не придется просматривать весь список отображения, чтобы узнать, изменился ли спрайт или любой из его родителей. Вы бы просто проверили глобальную позицию спрайта, и если он изменился, вы что-то называете.

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

Опять же, это не было бы идеально, так как вы не получили бы события сразу после переезда, но если вам не нужно знать это сразу, это может быть достаточно хорошо.

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