PDA

Просмотр полной версии : [Вопрос] Ограничение трассировки



tonline_kms65
14.04.2017, 05:34
Всем здравствуйте.
У меня есть такой вопрос, который я не представляю, как решить. Нужна ваша помощь. Вопрос немного не по этому языку, но принцип программирования везде одинаковый.

Суть вопроса такая:
Создана ENT(сущность Дрон), вооруженная самонаводящимися ракетами. После запуска ракет, ракета начинает поиск ближайшего, видимого противника.
Сам поиск противника построен по такой схеме - после запуска ракеты циклом нахожу все ENT(с нужным класснеймом, у меня "player"), неважно видимые или скрытые за препятствиями. Т.е. все противники найдены. Теперь трассировкой нахожу ближайшего видимого(не скрытого за препятствием) противника, начальная точка есть (ракета), конечная (противник) тоже есть. Если до момента попадания в противника, его кто то "грохнул" - ракета продолжает движение прямо, пока не будет найден следующий противник (или пока не истечет время жизни этой ракеты).
Вроде всё хорошо, все нормально. Есть одно НО. Противник может появиться не только спереди, он может появиться сзади, слева или справа, более угла 90 градусов (т.е. уже сзади). Естественно ракета резко меняет направление, и если она не успела улететь подальше от самого Дрона, то она просто ударяется в этого Дрона (своего родителя) и взрывается. Естественно наносит ущерб Дрону, да и ракета теряется впустую.

Теперь и сам вопрос - как ограничить трассировку видом только вперед, ограничить углом ~90 градусов? У кого какие мысли есть отпишитесь пожалуйста, а то у меня что то мозги не работают. Возможно сам алгоритм поиска противников у меня неверный. Код не нужен - нужны мысли.

Для примера видео - на нем видно, как ракета может лететь в какую угодно сторону за противником.

https://youtu.be/pR5mCMDrfWg
или здесь

https://youtu.be/t1B7629FbLs

Geebrox
14.04.2017, 11:33
Ну сам же написал ответ, проверяй угол ракеты относительно новой цели, если больше 90 градусов, то меняй противника и т.д. пока не найдешь нужную цель, в сампе для этого есть специальные функции GetPlayer(FacingAngle/Pos) и GetObject(Rot/Pos)

tonline_kms65
15.04.2017, 07:34
Ну сам же написал ответ, проверяй угол ракеты относительно новой цели, если больше 90 градусов, то меняй противника и т.д. пока не найдешь нужную цель, в сампе для этого есть специальные функции GetPlayer(FacingAngle/Pos) и GetObject(Rot/Pos)


Уже интереснее. Спасибо. Я правда не знаю такое выражение "в сампе". А может и знаю, только под другим названием. В принципе не суть важно.
Я прихожу к выводу, что дело все-таки не в самой трассировке, а в получении ID игроков, видимо моя ошибка в том, что я получаю сразу всех живых игроков. А нужно получить ID только тех игроков, которые да данный момент, находятся спереди ракеты.

Я могу получить текущее направление "взгляда" (вектор) ракеты, я могу получить точные координаты игроков. Но я не могу сообразить - как определить что те или иные игроки находятся сзади ракеты. Они ведь могут точно также находиться в пределах 90 градусов, но сзади.
Или я уже настолько отупел, или зациклился так что уже не могу выйти.

Geebrox
15.04.2017, 08:12
Ты на каком языке реализуешь все это? В языке PAWN есть функция atan2 с которым можно было бы решить такие вопросы. Берешь координаты игрока и вычисляешь их от координат ракеты, потом через atan2 находишь угол поворота, потом от текущего направление "взгляда" (вектор) ракеты вычисляешь полученный результат, если в итоге получится больше 90 градусов, находишь другую цель. Просто я не знаю на каком языке ты программируешь и какие там есть функции, из за этого я описываю их на языке PAWN и с функциями САМП.

ziggi
15.04.2017, 08:16
Уже интереснее. Спасибо. Я правда не знаю такое выражение "в сампе". А может и знаю, только под другим названием. В принципе не суть важно.
Я прихожу к выводу, что дело все-таки не в самой трассировке, а в получении ID игроков, видимо моя ошибка в том, что я получаю сразу всех живых игроков. А нужно получить ID только тех игроков, которые да данный момент, находятся спереди ракеты.

Я могу получить текущее направление "взгляда" (вектор) ракеты, я могу получить точные координаты игроков. Но я не могу сообразить - как определить что те или иные игроки находятся сзади ракеты. Они ведь могут точно также находиться в пределах 90 градусов, но сзади.
Или я уже настолько отупел, или зациклился так что уже не могу выйти.

Просто этот форум ориентирован на Pawn для SA-MP (San Andreas Multiplayer), а не на CS с SourcePawn.

По поводу твоего вопроса, думаю, что эта тема может помочь: http://pro-pawn.ru/showthread.php?12270

tonline_kms65
20.04.2017, 14:04
Просто этот форум ориентирован на Pawn для SA-MP (San Andreas Multiplayer), а не на CS с SourcePawn.
По поводу твоего вопроса, думаю, что эта тема может помочь: http://pro-pawn.ru/showthread.php?12270

По мне, так абсолютно всё-равно какой язык программирования. Мне не код нужен был.


http://pro-pawn.ru/showthread.php?12270 Не нахожу, чем эта тема может хоть кому нибудь помочь. В ней нет решения. Там вообще ничего нет.
Кому интересно - решение этой задачи есть здесь https://habrahabr.ru/post/131931/, всё ясно и понятно. Переписываешь под свой язык и все дела.