Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 6 из 6
  1. #1
    Аватар для tonline_kms65
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.09.2016
    Адрес
    Комсомольск на Амуре
    Сообщений
    8
    Репутация:
    0 ±

    Ограничение трассировки

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

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

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

    Для примера видео - на нем видно, как ракета может лететь в какую угодно сторону за противником.
    https://youtu.be/pR5mCMDrfWg
    или здесь
    https://youtu.be/t1B7629FbLs

  2. #2
    Аватар для Geebrox
    Пользователь

    Статус
    Оффлайн
    Регистрация
    24.08.2015
    Адрес
    Ташкент
    Сообщений
    375
    Репутация:
    97 ±
    Ну сам же написал ответ, проверяй угол ракеты относительно новой цели, если больше 90 градусов, то меняй противника и т.д. пока не найдешь нужную цель, в сампе для этого есть специальные функции GetPlayer(FacingAngle/Pos) и GetObject(Rot/Pos)
    Последний раз редактировалось Geebrox; 14.04.2017 в 11:38.

  3. #3
    Аватар для tonline_kms65
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.09.2016
    Адрес
    Комсомольск на Амуре
    Сообщений
    8
    Репутация:
    0 ±
    Цитата Сообщение от Geebrox Посмотреть сообщение
    Ну сам же написал ответ, проверяй угол ракеты относительно новой цели, если больше 90 градусов, то меняй противника и т.д. пока не найдешь нужную цель, в сампе для этого есть специальные функции GetPlayer(FacingAngle/Pos) и GetObject(Rot/Pos)

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

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

  4. #4
    Аватар для Geebrox
    Пользователь

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

  5. #5
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    790 ±
    Цитата Сообщение от tonline_kms65 Посмотреть сообщение
    Уже интереснее. Спасибо. Я правда не знаю такое выражение "в сампе". А может и знаю, только под другим названием. В принципе не суть важно.
    Я прихожу к выводу, что дело все-таки не в самой трассировке, а в получении ID игроков, видимо моя ошибка в том, что я получаю сразу всех живых игроков. А нужно получить ID только тех игроков, которые да данный момент, находятся спереди ракеты.

    Я могу получить текущее направление "взгляда" (вектор) ракеты, я могу получить точные координаты игроков. Но я не могу сообразить - как определить что те или иные игроки находятся сзади ракеты. Они ведь могут точно также находиться в пределах 90 градусов, но сзади.
    Или я уже настолько отупел, или зациклился так что уже не могу выйти.
    Просто этот форум ориентирован на Pawn для SA-MP (San Andreas Multiplayer), а не на CS с SourcePawn.

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

  6. #6
    Аватар для tonline_kms65
    Пользователь

    Статус
    Оффлайн
    Регистрация
    20.09.2016
    Адрес
    Комсомольск на Амуре
    Сообщений
    8
    Репутация:
    0 ±
    Цитата Сообщение от ziggi Посмотреть сообщение
    Просто этот форум ориентирован на 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/, всё ясно и понятно. Переписываешь под свой язык и все дела.
    Последний раз редактировалось tonline_kms65; 20.04.2017 в 14:10.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •