Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Избегание врагов (2 стр)

Избегание врагов (2 стр)

Поделиться
Страницы: 1 2
ChebПостоялецwww5 дек. 201720:52#15
Нужен комплексный подход.

1. Периодически пускать A* волну на небольшое расстояние, для каждой точки просчитывая, насколько близко будут враги, если убегающий побежит туда. Т.е. весь просчёт должен учитывать поведение гонящихся.
2. Ограниченность мышления: A* волна охватывает не всё постранство, а только то, что задано общим алгоритмом: если враги далеко, то проверять сектор в сторону от ближайших, но растекаться обходными путями, наткнувшись на непроходимое препятствие. Если враги близко - просчитывать все 360 градусов, но на гораздо мЕньшее расстояние.
3. Инерционность - т.е. смена направления увеличивает цену точки в A*
4. Тупые алгоритмы: панически метаться, если зажали, уклоняясь только от совсем уж ближайших. Или продолжать бежать в прежнем направлении если до всех врагов далеко.
В этом плане показателен тот ролик из реальной жизни, где на семейство диких свиней сверху роняют большую цилиндрическую клетку. Одно порося сделало несколько кругов вдоль сетки - неслось,  как с шилом в заднице, пока до него не дошло, что что-то тут не так.

E-ConeУчастникwww6 дек. 20173:17#16
Пусть бот бежит как от врагов, так и от стен и углов с домножением на определенный коэффициент. Я делал такое поведение бота в боксе - нормуль работало.
MiraПостоялецwww6 дек. 201710:50#17
Я делал так же,  по нормали от игрока убегание.
Первым вариантом было убегание с углон смещения.  Если бот упирался в стену то как бы скользя по ней все равно отступал.  Но вот если загнать в узкий тупик -  то все.

Вторым делал -  если бот упирается,  резко инвертирут путь и бежит через соперника,  чтоб встать с обратной стороны.  Но в узких проходах бот может попасть в рекурсивное беганье между стенами в присутствии врага)

MiraПостоялецwww6 дек. 201710:59#18
E-Cone
Я так средний вектор при присутствии нескольких врагов делал,  в зависимости от их расстояний (типа дистанс филда) и их опасности.

Получить дистанс филды для препятствий возможности не было,  была сторонняя игра( но идея правильная

damikПостоялецwww6 дек. 201714:02#19
возможно

https://habrahabr.ru/post/262181/

Цитата
> Если у нас, например, есть стреляющие юниты вроде танков в нашей армии, мы не хотим чтобы танки предвигались слишком близко к вражеским юнитам

MANABПостоялецwww6 дек. 201714:51#20
tac
> чтобы убегать от врагов ... не стоит наделять задачу тем, чего в ней нет
В таком случае самое эффективное убегание... стоять на месте, там где нет врагов в некотором радиусе. В противном случае - найти такие места и выбрать кратчайший путь.

Правка: 6 дек. 2017 14:52

tacПостоялецwww6 дек. 201716:19#21
MANAB
> стоять на месте, там где нет врагов в некотором радиусе
верно, но посчитать где это не так просто как кажется ... т.к. таких мест куча, а в данный момент убегая надо выбрать одно из них

Правка: 6 дек. 2017 16:19

tacПостоялецwww6 дек. 201717:23#22
Вообще хорошую тему подняли, предлагаю сделать конкурс на реализацию :)


Вот, что получается у меня ... парился пару, тройку дней ...  уже вроде ничего

Правка: 6 дек. 2017 17:29

fornetjobПостоялецwww6 дек. 201717:37#23
tac
> Вот, что получается у меня ... парился пару, тройку дней
Ещё немного и будет на уровне страуса.
alexanya11Постоялецwww7 дек. 201712:57#24
Я вопрос вроде как решил. Не реализовал ещё все до конца, конечно, но по идее все решено.

Принцип такой: сначала проходим по врагам, находим такие скопления врагов, в которых найдётся пара врагов, между которыми расстояние будет меньше двух радиусов атаки.

Далее для каждой группы вокруг каждого из врагов строим многоугольник. Я думаю, хватит 4-6 вершин. Множество вершин для каждой группы складываем в массив вершин, по ним строим выпуклую оболочку. В итоге имеем некий набор выпуклых многоугольников, описывающих группы врагов.

Имея эти многоугольники, точку, в которой находится бот и точку, в которую хотим попасть (можно найти её, посчитав "напряжённость" поля в ячейках с каким-то шагом, либо выбрать самую удаленную точку от нас. Вариантов масса), построим граф. Соединим ребрами все точки. Стоимость ребра - расстояние. Стоимость ребер, пересекающих группы врагов, умножаем на коэффициент. 100000, например. И если нас окружат, то путь все равно будет рассчитан оптимально, чтобы выбраться из окружения с меньшими затратами. Как-то так.

Это не сильно быстро считается, но многочисленные оптимизации имеют место быть.

tacПостоялецwww7 дек. 201716:46#25
alexanya11
> построим граф. Соединим ребрами все точки.
у тебя есть точка где ты стоишь, ну ладно даже есть, куда хотим, хотя ты не описываешь, где она , и точки групп врагов .. все? ну тогда там не будет графа там просто прямая от того где находишься туда куда хочешь
Страницы: 1 2

/ Форум / Программирование игр / Игровая логика и ИИ

2001—2017 © GameDev.ru — Разработка игр