Просмотр полной версии : На счет хиттеста
[G@ng$t@]Un1t
17.08.2006, 13:54
Есть объект стреляюший пулями. Есть танки(много танков)-враги. Как прописать между ними хиттест.
пропиши хит тест на каждый танк
хотя блин получается что пулек может много лететь
ну тогда танки отдельные мувики а пульки все в одном мувике вот)
[G@ng$t@]Un1t
17.08.2006, 14:10
2MIX-er: Да не чо то мне не нравится твоя идея. Пуль-нема, танков-нема.
[G@ng$t@]Un1t
17.08.2006, 14:16
Я думаю как с помошью массива сделать.
DarkLight
17.08.2006, 14:24
Помойму так: все танки - в мувик-контейнер, а передняя точка пули хитТестится с шейпом этого мувика. Если схитТестилась - перебором определяем танк, можно еще по координатам отсеивать...Если пуль максимум штук 20 одновременно, и примерно столько же танков, то тормозить не должно...
[G@ng$t@]Un1t
17.08.2006, 14:32
2DarkLight: Не получится потому что пулями стреляет управляемый танк который меняет свое положение. Как я понимаю неполучится. И вообше как потом понять какой танк отсеять?
DarkLight
17.08.2006, 14:37
И пусть себе меняет...Пуля летит по прямой (надеюсь:)). Соответственно, танка она коснется в первую очередь своей конечной точкой. Вот на эту точку и вешаем обработчик.
А отсеивать в этом случае нет смысла, так как быстрее сделать перебором... Сколько примерно танков?
[G@ng$t@]Un1t
17.08.2006, 14:48
Таеков примерно одновременно на экране штук 10. Помоему лучше повесить на каждый танк (или пулю) проверку на хиттест циклом по массиву с именами танков (или пуль). Только не знаю как реализовать, давно флэшэм не занимался, подзабыл многое.
Disajner
17.08.2006, 14:53
ПОделить всё поле на сетку, к каждой ячейки привязываются такнки, которые находятся в ней, и проверяется в какой ячейки находится пуля, и только те танки которые находятся в этой ячейки проверяются, а остальные нет...
Не помню как этот метод называется, вроде просто деления....Хотя можно ещё построить дерево но это сложно для флеша...
DarkLight
17.08.2006, 14:54
Я предлагаю этот вариант потому, что за 1 хитТест пуля сможет определить, попала ли она в танк. Т е в процессе полета - минимум вычислений. Когда выясняется, что в танк она попала - тогда перебором. По массиву - медленней, т к пуля проверяется на столкновение с каждым танком, даже если она не столкнулась ни с каким. А если учесть, что в жизни пули столкновение происходит 1 раз, то выигрыш в быстродействии довольно значительный.
+ Реализовать это легко
[G@ng$t@]Un1t
17.08.2006, 15:02
2DarkLight: Ну блин чо то я не очень врубился в твой вариант, привиди примерный код. А так это понятно что мой вариант тормознутей в разы.
[G@ng$t@]Un1t
17.08.2006, 15:06
2Disajner: А твой вариант почти такой же как мой. Да он чуть быстрей, но его сложновато реализовать.
DarkLight
17.08.2006, 15:12
1. Точка регистрации пули ставится на ее конец
2. Делаем
_root.createEmptyMovieClip("allTanks",_root.getNextHighestDepth());
Танков аттачим на allTanks.
3. Код для пули:
pulja.onEnterFrame = function():Void {
if (allTanks.hitTest(pulja._x, pulja._y, true)) {
for (var $obj in allTanks) {
if (allTanks[$obj].hitTest(pulja._x, pulja._y, true)) {
//Столкнулись, например удалим танк
allTanks[$obj].removeMovieClip();
}
}
}
};
[G@ng$t@]Un1t
17.08.2006, 15:21
Спасибо за код и вообше за идею, я разобрался. :D
Disajner
17.08.2006, 18:31
DarkLight
Не сказал бы что это бысть, всё равно все такник перебираются....
А если с сеткой то перебираются намного меньше, хотя суть та же. Но придётся по маятся со структурой данных.
2Disajner: А твой вариант почти такой же как мой. Да он чуть быстрей, но его сложновато реализовать.
Ты ещё не работал в 3D, вот там сложно реализовать, а этот способ один из самых лёгких=))))
DarkLight
17.08.2006, 20:22
2Disajner
Я делал нечто подобное. Сетка вызывает проблему, что либо объекту можно находиться только в одной клетке целиком, что заметно, либо приходится писать кучу лишнего кода для объектов в 2(3) клетках сразу...
В момент полета проверка одного столкновения выполняется быстро, чуть быстрее чем вычисление клетки...В момент попадания сеточный алгоритм быстрее, но результат примерно одинаковый, а трудозатраты на структуру данных на сетке высокие...
Я пользуюсь плитками, если они есть с самого начала, а вводить их только ради столкновения нет особого смысла...
Disajner хороший путь предложил, у танка есть свойство ячейка в которой он находится - пробегаешь по всем танкам, заносишь в массив только принадлежащие конкретной ячейки танки (той, в которой сейчас пуля) и их проверяешь.
Disajner
18.08.2006, 13:15
DarkLight вообще я имел ввиду не определять в какой клетки находится объект, а у каждой такой клетки есть список таеков находящихся в ней, и проверятются только танки которые находятся в этом списке=))) А насчёт того что проверка одной точки быстрее, не согласи!!!Вот почему: проверка принадляжания к клетки это максимум проверка 4 условик(геометрия=)))А попадания точки, если ещё учесть пересикает ли эта точка саму нарисованную картинку, а не только её ограничивающий прямоугольник , намоного больше будет выполнятся, т.к. форма картинки может быть любая, значит и условий много=)))) Хотя каждый деляает как ему удобно
Sneg Хорошая идея, лекго релизовать, и быстро=)))
[G@ng$t@]Un1t
19.08.2006, 01:01
Так вроде кажется сначала, что вроде легко эти столкновения реализовать. А как займешся этим сталкиваешся с некоторыми тонкостями, которые в общем то и усложняют процесс.
fromotherplanet
24.08.2006, 17:44
[G@ng$t@]Un1t, скажи пожалуйста, как решается эта проблема, у меня очень похожая!!!
fromotherplanet
24.08.2006, 17:51
а может его мыло скажете, очень надо...?
Заходишь к нему профайл и ищешь пункт отправить сообщение по email.
fromotherplanet
24.08.2006, 18:37
"Извините, этот пользователь отключил прием email. Если вам необходимо отправить письмо этому пользователю, свяжитесь с администрацией, вам смогут помочь."
Я понял сразу...Может всё таки дадите?
Если он отключил прием email, то я его дать не могу.
fromotherplanet
24.08.2006, 19:00
жаль...
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.