Как я могу получить объект, с которым сталкиваюсь в Actionscript 3?

Есть ли способ узнать, с каким объектом сталкивается объект?... Я хочу создать «объект-коробку» во флэш-памяти, который может идентифицировать любой другой объект (видеоклипы), который сталкивается с ним. Например, если я бросаю ящик на «поле» (движок или мир) и помещаю в него что-нибудь, я бы хотел, чтобы ящик сообщал мне, с каким объектом он сталкивается. Я не могу использовать hitTestObject, потому что заранее не знаю, с каким объектом столкнется поле.

Грубый песудокод того, чего я хочу достичь, выглядит следующим образом:

 if ( Movieclip(parent). UNKNOWN_OBJECT .hitTestObject(this) )
        trace(UNKNOWN_OBJECT.name);

UNKNOWN_OBJECT в приведенном выше примере не обязательно имеет тот же тип данных.


person Y_Y    schedule 21.01.2011    source источник


Ответы (1)


Вы можете перебирать все дочерние элементы родителя в каждом кадре, чтобы увидеть, происходит ли какое-либо столкновение. Однако это грубая проверка, и если у вас есть много объектов для проверки коллизий, я предлагаю вам заглянуть в Quadtrees или что-то подобное.

Вот пример того, как ваш «коробочный объект» может проверять столкновения:

// this is your ENTER_FRAME handler
private function handleEnterFrame(evt:Event):void {
    var p:MovieClip = parent as MovieClip;
    if(!p){
        return;
    }
    for(var i:int = 0, len:int = p.numChildren; i < len; i++){
        var child:DisplayObject = p.getChildAt(i);
        if(child != this && this.hitTestObject(child)){
            trace("Collides with: " + getQualifiedClassName(p.getChildAt(i)));
        }
    }
}

Все, что он делает, это проверяет коллизии со всеми дочерними узлами родителя (т. е. братьями и сестрами) в каждом кадре. Когда столкновение обнаружено, он отследит имя класса элемента, с которым он столкнулся. Чтобы сделать это более полезным, было бы неплохо отправить некоторое событие или сигнал в момент обнаружения столкновения, чтобы ваши классы могли «прослушивать» столкновения.

person bummzack    schedule 21.01.2011