Как я могу проверить попадание двух динамически добавленных объектов в AS3?

У меня есть сетка объектов, которые были добавлены на сцену динамически, объекты относятся либо к классу Red, либо к классу Blue, как мне выполнить проверку попаданий по классам? Я хочу, чтобы синий объект исчезал, как только он попадал в красный. Помогите, пожалуйста, если у вас есть видео или ссылка на учебник, который был бы признателен. Спасибо.


person Garth Humphreys    schedule 23.07.2011    source источник
comment
Один из ответов ниже сработал для вас?   -  person    schedule 23.07.2011
comment
Почему вы не можете просто использовать hitTestObject? Возможно, вам придется опубликовать некоторый код, чтобы уточнить, что вы подразумеваете под динамическим, потому что обычно я бы сказал, что если вы хотите выполнить тест на попадание между двумя объектами, используйте hitTest   -  person jhocking    schedule 26.07.2011


Ответы (3)


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

http://code.google.com/p/collisiondetectionkit/

person papachan    schedule 23.07.2011
comment
Спасибо @papachan! Я собираюсь попробовать это - person Garth Humphreys; 23.07.2011

Вот ссылка на учебник, а ниже выдержка из этого руководства, которая показывает основной принцип:

import flash.events.Event;

this.addEventListener( Event.ENTER_FRAME, handleCollision)

function handleCollision( e:Event ):void
{
    if(circle_mc.hitTestObject(rect_mc))
       {
           output_txt.text = "HIT"
       }
       else
       {
           output_txt.text = "MISS"
       }
}

http://www.designscripting.com/2011/05/hittest-as3-for-collision-detection-flash-actionscript-3/

То, что вы собираетесь сделать, это, возможно, встроить этот код выше в ваш класс Blue, а затем в основном проверить и посмотреть, не наткнулись ли вы на какой-либо объект на сцене, а затем проверить, чтобы убедиться, что его тип является типом Red или любым другим, который вы хотите, затем делайте все, что хотите, в зависимости от результата:

import flash.events.Event;
import mypackage.Red;

this.addEventListener( Event.ENTER_FRAME, handleCollision)

function handleCollision( e:Event ):void
{
    if(stage){
        var i:int = 0;
        for(i; i < stage.numChildren; ++i){
            if(this.hitTestObject(stage.getChildAt(i) && stage.getChildAt(i) != this){
                if(stage.getChildAt(i) is Red){
                   //This object has collided with a Red object
                }
            }
        }
    }        
}

Я просто слепил этот код из головы, но если он не работает «из коробки», просто используйте основной принцип и соответствующим образом измените его. Кроме того, наличие множества объектов, сканирующих всех дочерних элементов сцены одновременно в каждом кадре, в конечном итоге станет очень трудоемкой задачей и приведет к задержке вашего приложения. Что было бы более предпочтительным, так это иметь одно событие enter_frame где-нибудь с двумя вложенными циклами for, проверяющими всех дочерних элементов, чтобы увидеть, кто с кем сталкивается, или, что еще лучше, структуру связанного списка для красных/синих объектов и использовать цикл связанного списка для проверки столкновения .

person Community    schedule 23.07.2011
comment
Спасибо, я думаю, это то же самое, о чем я говорил выше, я должен выполнить проверку попадания на объекты, которые были добавлены на сцену динамически. - person Garth Humphreys; 23.07.2011
comment
Извините, я только что увидел, что вы написали, я попробую вторую часть, еще раз спасибо! - person Garth Humphreys; 23.07.2011
comment
Этот код получит все объекты, находящиеся на сцене во время выполнения цикла. Поэтому, если вы динамически добавили объекты, при следующем запуске цикла эти объекты будут захвачены. Это связано с тем, что цикл проходит через каждого прямого дочернего элемента этапа (stage.getChildAt(i)) в зависимости от количества добавленных дочерних элементов, которое увеличивается каждый раз, когда объект добавляется либо статически, либо динамически. - person ; 23.07.2011
comment
Нижний код не будет работать со стадией в файле класса и должен быть заменен родительским - person Koden; 16.10.2020

http://www.foundation-flash.com/tutorials/as3hittesting/

person apscience    schedule 23.07.2011
comment
Спасибо @gladoscc, но я думаю, что это работает только с объектами, которые уже находятся на сцене с именем экземпляра. Что делать, чтобы проверить попадание объектов, добавленных на сцену динамически. - person Garth Humphreys; 23.07.2011
comment
У вас может быть массив красных и другой массив для синих, затем перебирать один массив и тестировать другой. Вот что я бы сделал. - person apscience; 24.07.2011