![]() |
Помогите разобраться с пересечением объектов..
Вложений: 1
Столкнулся с очередной головоломкой!
Наглядный пример - пули должны разбиваться о блок, что и происходит, пока пули летят через фрейм или реже (первая часть примера). Но стоит запустить их в каждом фрейме (вторая часть) - как нате вам.. Видно под таким напором блок устоять не может и поддается :) Ширина пули больше её шага. Плюс ширина блока. Перескакивание невозможно! И если fps маленький - отлично видно, что пули ПЕРЕСЕКАЮТ блок. Основной код: Код AS3:
Код AS3:
|
Предлагаю более подробно ознакомиться с методами "hitTestObject()" и "hitTestPoint()" в вашей ситуации я бы поступил иначе:
1) Проверка дистанции от объекта до пули. Код AS3:
Код AS3:
|
Код AS3:
stweet, не поможет изменение проверки. |
stweet Проверка была математической. Без всяких hitTest. Грешил, что где-то накосячил в расчетах. Постепенно выкинул все что мог пытаясь найти причину. Плюнул и написал этот пример с нуля, чтобы исключить все нестыковки. Но не тут то было.. Пришел к мысли, что ошибка связана с массивом, но как её поймать так и не решил.
maxkar Вот пасибо! А то я так и не понял в чем секрет slice! Помогли исправить данную проблему таким советом: for each(var m:MovieClip in aBlt) -> for each(var m:MovieClip in aBlt.slice()). Получается во время обхода всех элементов массива - я выдергивал из него один элемент - массив сжимался - и на следующем обходе я "терял" один элемент? Но чем помогает slice? slice выполняется каждый раз в начале цикла? |
Цитата:
Код AS3:
Цитата:
Код AS3:
Цитата:
Хотя в вашем случае slice все таки тяжеловат. Лишняя копия, затем поиск в массиве (хотя и быстрый) и удаление. Можно проще, с явной итерацией по индексу: Код AS3:
В вашем конкретном случае есть и еще один принципиально отличный от приведенных выше вариант. Он использует то, что пули отсортированы по горизонтали и если какая-то пуля еще не долетела до стенки, все остальные тоже не долетели. Тогда проверка идет только по одному элементу: Код AS3:
Код AS3:
Выбирать в данном случае стоит тот вариант, котороый вам понятнее :) |
Цитата:
В итоге имею два варианта: - первый (кто точно знает - 'aBlt.slice()' создает копию исходного массива при КАЖДОЙ итерации или только один раз при вхождении в цикл?) Код AS3:
Код AS3:
====================================================================================== Цитата:
..проверил таким способом: Код AS3:
Код:
start====================================================================================== Более быстрым оказался цикл 'while': Странное поведение 'for each' при 50% отсеивания :eek: (NNN=-1) Отсеивается 100%......while: 60.....for each: 95 (NNN=5000) Отсеивается 50%.....while: 32.....for each: 645!! (NNN=20000) Отсеивается 0%.....while: 3.......for each: 3 Код AS3:
|
В while с декрементом багу поправьте. Там первый элемент не проверяется. Условие должно быть while(i >= 0).
Да, по производительности while с конца на самом деле будет не хуже итерации по for each. При удалении элемента в "середине" массива этот массив нужно сдвигать. Если сдвигать "конец" массива, то при итерации "с конца" там будут только "выжившие" элементы. А при цикле for each придется сдвигать и элементы, которые потом будут удалены. Как раз это и дает сильный рост при удалении половины элементов на for each. Флеш-плеер может пытаться оптимизировать удаление (удаление на границе оптимизирует, это видно по вашим тестам), но в этом случае это сделает итерации for each и while эквивалентными по времени. Тест на отсеивание 50% не совсем честный по отношению к while. Там все удаляемые элементы в конце, поэтому никаких сдвигов не происходит. Элементы стоит сделать удаляемые хотя бы через один, в этом случае время будет более адекватно отражать общий случай. И еще замечание. Если у вас в реальном приложении будет много удалений в середине массива, быстреер всего делать фильтрацию, это дает максимум 1 проход по массиву + затраты на выделение памяти. Псевдокод: Код AS3:
|
Исправил чутка по своему:
Код AS3:
|
| Часовой пояс GMT +4, время: 13:28. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.