![]() |
Вопрос про наболевшее - коллизии.
Есть игрок с возможностью стрелять снарядами (их полёт виден) и боты, каждый из которых входит в массив типа tank.
Как определить, при обработке коллизий "снаряд-бот", кто из ботов столкнулся со снарядом, если все они относятся к одному типу коллизий (CONST BOT_C=1). Т.е. при столкновении снаряда и объекта типа BOT_C возникает коллизия с ботом, но как узнать кто из целого массива ботов её создал (и затем удалить только этого бота)? |
Ответ: Вопрос про наболевшее - коллизии.
Собрал простенькую программулину (все не выкладываю только основные моменты).
Код:
Код:
|
Ответ: Вопрос про наболевшее - коллизии.
Ерунда, а не код
высавил коллизию пуля-танк, а проверяешь танк-пуля По сабжу: используй не массивы, а типы (удобнее) EntityCollided(пуля,тип_танка) возвратит тебе ентити. с которым произошла коллизия Доступ к элементу типа ты можешь получить либо простым перебором (сравнивая полученный ентити с ентити танка из типа), либо с помощью команды Object Код:
t.tank=New tank |
Ответ: Вопрос про наболевшее - коллизии.
А можно вообще не юзать коллизию, а юзать EntityDistance
|
Ответ: Вопрос про наболевшее - коллизии.
Да, согласен с Raiter -ом. вот тока так по хитрому (через object/handle) уже не выбереш нужный элемент. придется перебирать.
|
Ответ: Вопрос про наболевшее - коллизии.
Проблемка возникнет с быстрыми объектами :)
Если будет юзаться физ движок, (PhysX), тогда триггерами проверять. И можно без перебора получить будет объект, в которого попали. |
Ответ: Вопрос про наболевшее - коллизии.
Я вообще бы рекомендовал проверять на пересечение отрезка со сферой. давно выкладывал ф-ии.
|
Ответ: Вопрос про наболевшее - коллизии.
tormoz, спасиб !! :super:
меня этот код направил на очень умную мисль !! |
Ответ: Вопрос про наболевшее - коллизии.
Кусок моего кода
Код:
For a.bot=Each bot |
Ответ: Вопрос про наболевшее - коллизии.
этот кусок был выдран небрежно.
почему без цикла o ? |
Ответ: Вопрос про наболевшее - коллизии.
Почему небрежно? Нафиг ему он нужен?
Он вообще по видимому уже реализовал выстрел. Код показывает как удалить бота вместе с патроном. Ну если очень надо могу и всю функцию выложить: Код:
For o.s=Each s |
Ответ: Вопрос про наболевшее - коллизии.
вот почему:
Код:
For a.bot=Each bot |
Ответ: Вопрос про наболевшее - коллизии.
Blitzerg
1) пуля летит отсилы 2 км, в реальном случае - 400 метров 2) ограничивать полет лутче по времени чем по растоянию до игрока 3) у тебя перебор O(N^2), надо юзать деревья разбивки, хотя бы по сегментно 4) Код:
If EntityDistance(a\entity,o\pulka)<10 Then Код:
If EntityDistance(a\entity,o\pulka)<10 Then |
Ответ: Вопрос про наболевшее - коллизии.
jimon, ты издеваешся?
как будет не_программер писать деревья разбивки? Цитата:
|
Ответ: Вопрос про наболевшее - коллизии.
Дык, добавь перед последним Endif, Exit.
|
Ответ: Вопрос про наболевшее - коллизии.
Ну это пули юзера.
А пули ботов ограничены по времени. (но я думаю перевести это дело на расстояние, не нравится мне эта куйня с временем) Добавил: Пересмотрел. Шо это за фигню ты написал? Конечно не проще. У меня в конце прописано удалять пулю если o\delet=1 Это бывает в 2 случаях: 1. если пуля улетела далеко от юзера. 2 если пуля подлетела близко к боту. А у тебя получается что пуля должна удаляться только тогда когда подлетит к боту. Ты мне код не проще сделал, а наоборот усложнил, придётся отдельно дописывать удаление при дистанции от юзера. Тобиш пулю удалять надо в двух разных случаях, а не только когда o\delet равен одному. |
Ответ: Вопрос про наболевшее - коллизии.
впринципе да. exit-ом можно решить. но он вроде выведет тока за один цикл. а надо за оба.
|
Ответ: Вопрос про наболевшее - коллизии.
Тогда ставим ещё одно условие, на проверку наличия объектов, если отсутствуют - лепим Exit.
|
Ответ: Вопрос про наболевшее - коллизии.
Не нужно сравнивать дистанцию - в этом случае не целесообразно (придется перебирать цикл в цикле, или пули в танках, либо танки в пулях)
Обычная тупая коллизия прекрасно сработает. И можно решить практически любую задачу особо не напрягаясь На пули нужно делать так: счетчик времени : о\тайм=о\тайм+1 ент=ЕнтитуКоллидед(о\ент,тип_бот) ент2=ЕнтитуКоллидед(о\ент,тип_уровень) Иф ент ор ент2 о\тайм=401 ендиф Иф о\тайм=>400 Иф о\тайм=401 БольшойБум(о\ент) ЕндИф ФрееЕнтити о\ент Делете о ЕндИф |
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
теперь смотри - мы просто вводим поле обозначающее удаленность объекта, и проводим всякие проверки, потом, в самом конце, если удален стоит метка то удаляем ентити и объект. зато так можно "удалять" пульку в любом месте, ошибки не будт. |
Ответ: Вопрос про наболевшее - коллизии.
tormoz
Цитата:
HolyDel упс, не заметил :) Blitzerg чувак, представь что ты строчку o\delet = 1 замениш на удаление пули кода меньше ! ... в любом случае ты делаешь ДВЕ проверки и еще одну проверку o\delet = 1 .. в итоге три проверки ... а так будет две .. где сложности ? не вижу ... |
Ответ: Вопрос про наболевшее - коллизии.
А если у меня 20 разных видов ботов, ещё земля, ещё дома, ещё предметы.
Чё мне каждый раз писать: Код:
if событие then Не проще ли мне писать if событие then o\delet=1 ?? Не кажется ли тебе, что я туеву хучу строк экономить буду? |
Ответ: Вопрос про наболевшее - коллизии.
Blitzerg, О! Я кстать недавно об этом задумался, и понял, экономия строк, порой - плохо. Смотри, у тебя будет лишнея переменная, :) А условие, всёравно выполнится ;)
|
Ответ: Вопрос про наболевшее - коллизии.
уууу!!!
Код:
if entitydistance(o\pulka,vrag1) then |
Ответ: Вопрос про наболевшее - коллизии.
Ошипко!
Пулё не найдено, идите накуй. Думаю такое будет? |
Ответ: Вопрос про наболевшее - коллизии.
угу. такое и будет. именно поэтому (а не из за экономии строчек, или экономии памяти) надо завести свою перменную с состоянием "удаленности"
при нынешних 2Гб памяти, потратить жалких 4 байта на пулю - ну это совсем ничего. |
Ответ: Вопрос про наболевшее - коллизии.
Ну да. Так и есть )
Собсно по этому она там и поставлена. Про экономию я сморозил. Просто изложил в теории еслиб предложение джимона работало то это было бы не экономно ) |
Ответ: Вопрос про наболевшее - коллизии.
перебор в данном случае не рулит. Рулит парабола-триггер как mesh, скалящийся в зависимости от угла выстрела (если уж совсем реализм и пули летают по навесной) или же бокс-цилиндр-извращенно_скаленный_шарик с проверкой на коллизию. Особенно в данном случае рулит сторонний физ. двиг.
по поводу реально летящих в данном случае пуль (особенно медленнолетящих) - мы знаем, что пуля летит всю свою траекторию за 700 с буем мс. А дальше проверяем коллизию триггера, если бот словил ее, то проверка на то, сколько процентов траектории (ее максимальная длина также изначально определена) пульк0 пролетела, и если бот стоит примерно ("допуск" обязателен - мс не будут топать точно по n штук после каждой команды!) на этом промежутке - хит по нему, через обжект ессно, удаляем бота и после ставим флажок удаления пульке. |
Ответ: Вопрос про наболевшее - коллизии.
HolyDel
мне это сводить к знаниям не_программиста или ты издеваешся ? есно что если я напишу какой-то бред который даже логически не пашет то и в компиляторе он не запашет |
Ответ: Вопрос про наболевшее - коллизии.
Какой бред?
Твой вариант кода не предпологает, что пулю надо будет удалять в множестве различных событий. Так как если пуля будет удалена при определённом событии, и после этого будет другая проверка пули а пули то уже нет, то будет ошибка кода, и игра вылетит. Холи это какрас и продемонстрировал своим вопросом. |
Ответ: Вопрос про наболевшее - коллизии.
Jimon имел ввиду секционную разбивку. которую в идеале надо делать. и кстати, как седлать ее в блице - хз. хотя я писал либу.
|
Ответ: Вопрос про наболевшее - коллизии.
оффтоп на тему blitz3d :)
|
Ответ: Вопрос про наболевшее - коллизии.
элементарно Ватсон, ввели какую нибудь магию которая удаляет ВСЕ пули в некотором радиусе.
|
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
На блитц3д без всяких ооп и так все работает быстро и четко если код грамотно построен За один проход цикла она никак "всех поубивает" На коллижн ставим стоп и удаляем Какие проблемы ? зы. все эти холливары исключительно от недостатка опыта и буйной фантазии. :)))) |
Ответ: Вопрос про наболевшее - коллизии.
с коллизиями да. а если без них?
|
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
1) Вид сверху! (Почти 2D), поэтому ни про какую траекторию пули не надо заморачиваться. 2) Скорость пули тоже постоянна. 3) Боты двигаются в одной плоскости с пулей (т.е. почти земле), поэтому она всегда врежется либо в бота, либо в ограждение уровня, либо в другую пулю. При любом столкновении (как это написать?) она исчезнет. 4) Говорят, что при движении и ботов, и пули следует создавать 2 коллизии: бот-пуля и пуля-бот, так вот! ещё и не понятно, почему иногда срабатывает одна, иногда - другая коллизия? :( 5) Все боты относятся к типу tank и двигаются-думают в цикле: For bot.tank=Each tank ..... Next Где лучше проверять коллизию? В Этом цикле или в общем "игровом" цикле? 6) Даже на такую строчку (неважно, где она написана, либо внутри цикла ботинков, либо внутри игрового цикла): If (EntityDistance# (player1\bul,bot\ent))<2 Then Stop BB выдаёт ошибку "переменная должна быть типом" [player1\bul - сам кубик пули, созданный примитивным player1\bul=CreateCube() а вот bot\ent созданна через bot.tank=New tank bot\ent=CreateCube() где Type tank Field ent; entity Field dir; direction-направление Field sp#; скорость End Type и ничего больше] Вобщем, как при попадании пули в бота убивать НУЖНОГО бота, в то время как пуля должна сама исчезнуть при ЛЮБОМ попадании? Ух! Вроде б вопрос-то несложный, но что-то запарился уже. И ещё вопросик: почему обещанный HideEntity, который скрывает объект от глаз и КОЛЛИЗИЙ, иногда всё-таки срабатывает на коллизии EntityCollided? |
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
Вот я и набросал как это можно сделать, хочя и знал что лучше сделать через типы. |
Ответ: Вопрос про наболевшее - коллизии.
Люди есть вариант. Не знаю как вы одобрите.!
Если сделать через EntityPickMode типа прицел направлен на объект. Сразу определяется в Dim какой это объект. И при нажатии выстрела просто вылетает пуля а объект удаляется. Это все без коллизии. Но пуля должна двигается быстро чтоб не получилась объект удалился а пуля только настигла его! |
Ответ: Вопрос про наболевшее - коллизии.
Блин
Делай с коллизиями без всяких дистанций- быстрее работает Если хочешь дистанции, то придется обрабатывать внутри цикла пуль цикл ботов: Код:
For o.shot=Each shot |
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
|
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
Коллизия происходит между первым и вторым типом То есть, если движется первый тип, то коллизия будет, а если только второй - то нет Твой код работал только тогда, когда танки двигались Компрене ? |
Ответ: Вопрос про наболевшее - коллизии.
В том то и дело что не двигались. я просто натыкал неподвижных обьектов в пространстве. вот еще раз проверил, проверка всеравно срабатывает так.
--- При перемене местами типов коллизия не срабатывает. так что зря ты это так поспешил с выводами. возможно дело в том что счетчик для массива, а не как принято: For s.shot=Each shot ... if EntityCollided(s\entity,BOT_C) ... ... Next но я могу ошибаться |
Ответ: Вопрос про наболевшее - коллизии.
О_о коллизия работает быстрее?
это точно? я чесно сказать не проверял, но ведь при коллизии еще дофига всего проверяется, точка коллизии, смещение объекта, который коллизится куда-нибудь, еще наверное какие нибудь рассчеты? |
Ответ: Вопрос про наболевшее - коллизии.
ы? я тоже думал что дистанс быстрее коллизии 0.о
|
Ответ: Вопрос про наболевшее - коллизии.
Цитата:
Коллизия сфера-сфера работает быстрее дистанса Особенно если много объектов - это заметно |
Ответ: Вопрос про наболевшее - коллизии.
Да, быстрее, я как-то проверял.
Теперь интересное: почему. Процесс перебора + дистанс с точки зрения запущеного экзешника: грузится двиг блитца. Скрипт-двиг трейсит код, и натыкается на мейн-луп. В нем находит переход на функцию вложенного перебора. Запускает поиск внешнего элемента (пули) среди всех. (EACH) Возвращает в ОЗУ все положенные данные из полей Запускает поиск внутреннего элемента (танка) Опять забивает ОЗУ И только сейчас, имея на руках в памяти через к примеру bullet\entity и tank\entity он получает запрос на дистанс. Как думаешь, быстро? Теперь коллизии, которые происходят внутри самого движка, т.е. без гоняния туда-сюда скрипт-машины: грузится двиг блитца. Скрипт-двиг трейсит код, и натыкается на мейн-луп. В нем находит переход на функцию вложенного перебора. Запускает поиск внешнего элемента (пули) среди всех. (EACH) Возвращает в ОЗУ все положенные данные из полей Ловит запрос на коллизии с методом STOP. Начинает внутри своих данных руководствуясь группами коллизий (EntityType) перебор, проверяя по сути тот же Distance и... ничего не делая, кроме как останавливая объект, т.е. никакие доп. вычисления траектории обтекания и пр. не происходят! А теперь вопрос на засыпку: на(забанено) мучать скрипт-машину блитца лишние n раз, да еще и вложенным перебором? (; |
Ответ: Вопрос про наболевшее - коллизии.
Кто пробовал, заметен прирост на деле, при например обработке 50ти пуль? Стоит ли пробовать менять на коллизию?
|
Ответ: Вопрос про наболевшее - коллизии.
Стоит
|
Часовой пояс GMT +4, время: 02:22. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot