2015-01-03 5 views
1

Я разрабатываю бесконечный бегун с прокруткой, в котором главный герой может стрелять по препятствиям, когда собирает способность стрелять. Я использую скрининг и скрипт действий 3. Я нацелился на 60 кадров в секунду.Итерация через большое количество объектов для обнаружения коллизии

Для обработки столкновений между пулями и препятствиями хранить все пули, которые на экране в массиве и перебирать все пули и сделать тест столкновения со всеми препятствиями, на экране

Теперь, если у меня есть 30 пуль на экране и позволяет сказать 8 препятствий, а затем количество тестов переходит на 30 * 8 = 240 Я думаю, что его перегиб

Можете ли вы предложить мне элегантный (более быстрый) способ сделать это. И еще одна вещь Я делаю испытание на коллизию, как это говорит мне, если есть лучший способ

var object_1_rect : Rectangle = object1.getBounds(this); 
var object_2_rect : Rectangle = object2.getBounds(this); 
if (object_1rect.intersects(object_2_rect)) 
{ 
    //they are colliding 
}  

ответ

2

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

Таким образом, вместо вложенного цикла, проверяющего каждую пулю против каждого препятствия, каждая пуля может содержать массив, ссылающийся на каждое препятствие, когда оно добавляется на сцену, и этот массив используется для проверки столкновений с каждой пулей. Когда x пули достаточно далеко от препятствия, с которым они никогда не сталкиваются, вы можете удалить эту ссылку на препятствие из массива ссылок на препятствия.

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

Edit:

Или еще проще всего было бы перебрать пуль первых, получить их x, затем пропустить все препятствия во внутреннем цикле, где пуля находится дальше, чем препятствие.

Если вы храните препятствия в массиве в обратном направлении, так что x позиции могут быть 500, 400, 200, 100, 50 и так далее, то в дальнейшем пуля становится, тем меньше он знает, что нужно проверить. Если пуля достигает x позиции 450, то знает, ей не нужно проверять остальную часть препятствий в массиве, и вы можете полностью пропустить остальную часть массива.