@Gapnik
Студент - МГТУ им. Н. Э. Баумана

Как реализовать НЕ рентгеновское зрение «врагов» в игре?

Доброго времени суток.
Пишу небольшую игру ( для себя) на python. 2d игра , типа рпг (но с элементами стелса) , вид сверху. Начал описывать "врагов," дошел до зрения и сдулся, не могу понять, как заставить "врагов" не видеть сквозь стены. У них есть направление взгляда (вектор) и область в которой они видят (треугольник), но как из треугольника вырезать нужный кусок.
Возможно сам подход с областью не верный. Подскажите пожалуйста.

Стена имеет 2 координаты центра.
  • Вопрос задан
  • 809 просмотров
Решения вопроса 1
Tiendil
@Tiendil
Разработчик ПО.
Не нужно ничего вырезать.

Берёте все ключевые точки в области видимости (врагов, друзей, лут, ещё что-то) и проверяете есть ли препятствия на линии между ними и ботом. Т.е. проверяете, пересекает ли линия какое-либо препятствие. Если пересекает, то бот точку не видит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@SeptiM
Мне кажется, что вам нужно нужно научиться вырезать один многоугольник из другого. Сначала у вас есть треугольник. Берем первую стену, которая есть в треугольнике. Пусть это будет отрезок. Отрезок закрывает некоторую область для противника (понятно какую, да?) Вот эту область нужно вычесть из треугольника. Дальше берем следующую стену внутри видимой области и снова вычитаем из нее т.д.

По сути нужны две операции. Определить, пересекаются ли отрезок и многоугольник, и научиться вычитать один многоугольник из другого. Вот, может, эта библиотека поможет: https://pypi.python.org/pypi/Shapely
В любом случае рекомендую искать готовое решение.
Ответ написан
Комментировать
angru
@angru
Может посмотреть в сторону лучей?
1. проверяем дистанцию до игрока, если в зоне видимости - продолжаем.
2. кастуем луч от противника к игроку.
3. проверяем находится ли луч в области видимости(что-то типа 0 >= abs(угол луча - угол поворота противника) <= (угол обзора противника / 2)
4. проверяем пересекается ли луч с отрезком(стеной) (гуглим алгоритмы)
Ответ написан
Комментировать
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
А какой фигурой у вас описывается игрок?
Можно брать точку обзора охранника (голова, глаза) и "выстреливать" прямыми, которые будут ограничиваться углом обзора. Если работать в полярной системе координат, то переносим начало координат в точку обзора, принимаем одну из сторон "треугольника обзора" за ось. Затем рисуем десять линий, которые выходят из начала координат и различаются лишь углом поворота. Причем все углы линий будут меньше, чем угол обзора.
Теперь все просто: работаем с геометрией пересечений. Единственная сложность это выстроить элементы друг за другом так, как они идут в реальном мире.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы