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

Избегание врагов

Поделиться
Страницы: 1 2 Следующая »
alexanya11Постоялецwww3 дек. 201716:25#0
Собственно, нужно реализовать следующее: есть некоторое поле, по которому бегают враги. Поле квадратное, препятствий нет.
Нужно сделать бота, который будет бегать от врагов.

Была идея - берем нормаль от врага к боту. Умножаем нормаль на 1/расстояниеОтБотаДоВрага, и все эти нормали от всех врагов суммируем.
Получаем вектор, который будет вектором направления движения бота. С коэффициентами можно играться - к примеру, брать не 1/x, а 1/x^2 и так далее.

Но это плохо работает, когда бота прижимают к стене или к углу.

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

Правка: 3 дек. 2017 16:26

eugenelozaПостоялецwww3 дек. 201717:01#1
alexanya11
> Но это плохо работает, когда бота прижимают к стене или к углу.
А как Вы себе это иначе представляете? Если враги бегут напрямую на бота, то, естественно, они зажмут его. Разве что, если у бота есть вариант эксплоитить поведение врагов (например, если они медленнее)... или телепортироваться. Встреча с врагом - смерть или потеря здоровья?
alexanya11
> карта довольно большая
Насколько большая?
Я бы тупо "заливкой" разукрасисл бы карту точками, куда может за сколько ходов/времени добраться бот и его враги - как минимум некоторую ближайшую часть. Соответственно, искать путь по точкам, где максимальная разница (t_enemy - t_bot) / t_to_reach_point. Иными словами, пытаться занять точки, до которых наиболее долго бежать врагам и при этом быстро бежать самому. В "естественных условиях" это производительность не должно нагружать, а потом можно пооптимизировать.

Правка: 3 дек. 2017 17:02

alexanya11Постоялецwww3 дек. 201717:10#2
eugeneloza
> Встреча с врагом - смерть или потеря здоровья?

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

eugeneloza
> Насколько большая?

Карта довольно большая, чтобы разбивать ее на ячейки размером с персонажа. Но попробовать можно.

Правка: 3 дек. 2017 17:12

tacПостоялецwww3 дек. 201718:07#3
alexanya11
забавно как раз работаю над этим :) скоро запишу видео ... 5$ за ассет

делаю в рамках игры http://www.gamedev.ru/projects/forum/?id=231706

Правка: 3 дек. 2017 18:08

tacПостоялецwww3 дек. 201718:09#4
alexanya11
> Но это плохо работает, когда бота прижимают к стене или к углу
alexanya11
> Поле квадратное, препятствий нет.
постановка противоречива :)
alexanya11Постоялецwww3 дек. 201718:11#5
tac
Имелось в виду то, что поле ограничено своим размером, но на поле нет других препятствий. Думаю, в это прекрасно поняли
tacПостоялецwww3 дек. 201718:17#6
alexanya11
> поле ограничено своим размером, но на поле нет других препятствий
нет ни какой разницы, если поле ограничено - значит есть препятствия

для алгоритма это означает, что он должен уметь учитывать препятствия

Правка: 3 дек. 2017 18:25

CiaphasПостоялецwww3 дек. 201719:30#7
В условиях замкнутого поля просто бежать в ПРЯМО противоположенную (вектор, противоположенный вектору от бота на противника) сторону от врагов нельзя.
Если бежать таким способом на стенку под углом, близким к прямому, ведя на хвосте врагов, то загонишь себя в тупик.
Нужно бегать вдоль стен кругами, ведя врагов за собой.
Враги ведь не бегут наперерез, верно?
Просто бегут прямо на бота.

Алгоритм должен быть примерно таким:
— когда в прямо противоположенном врагу направлении близко ничего нет, бежать в нем
— когда в этом направлении появляется стенка, нужно бежать на нее под таким углом, чтобы потом погоня продолжалась вдоль этой стенки.
    Можно попробовать брать направление, среднее арифметическое от вектора вдоль стенки и вектора, прямопротивоположенному направлению на противника (обозначим V).
— в угол не бежать ни в коем случае: среднее арифметическое между направлением, противоположенном углу и V
 

}:+()___ [Smile]Постоялецwww3 дек. 201720:35#8
alexanya11
> Но это плохо работает, когда бота прижимают к стене или к углу.
Отталкивание от стенок еще добавь.
MANABПостоялецwww4 дек. 201716:38#9
Даже если карта большая слишком относительно размеров врагов и их путей патрулирования, можно это все логарифмировать. В любом случае получится грид, на котором можно построить поиск пути. И поиск этого пути время от времени придется обновлять, как часто - зависит от оптимизации. Я бы например подобрал такой размер клеток, чтобы переход от одной до другой у врагов занимал около  пары секунд. И помечал какие клетки проходимы/непроходимы по наличию в них врагов. Далее строится путь в конечную клетку, куда надо придти, и по событию перехода врагов между клетками этот путь перерасчитывается.

Правка: 4 дек. 2017 16:39

tacПостоялецwww5 дек. 20170:36#10
MANAB
> клетки проходимы/непроходимы по наличию в них врагов
была такая мысль считать врагов препятствием, но все же нет ... враги это не препятствие ... я пришел к тому, что надо оценивать опасность сектора, на основании врагов, а препятствия решать локально ... есть -  обойди ... темп другой

Правка: 5 дек. 2017 0:39

MANABПостоялецwww5 дек. 20179:23#11
tac
> враги это не препятствие
На уровне абстракции "игра" это не препятствие, но на уровне абстракции "поиск пути" это препятствие (ну или более трудно проходимый участок, в зависимости от алгоритма), т.к. эти участки нужно обходить.
tacПостоялецwww5 дек. 201715:41#12
MANAB
> или более трудно проходимый участок
тогда уж, область с радиусом вокруг врагов более трудно проходимый участок, в зависимости от опасности врага

но такое представление не показывает куда бежать

> строится путь в конечную клетку
это алгоритм должен определить куда бежать, и поиск пути тут никак не помогает

MANABПостоялецwww5 дек. 201719:22#13
tac
> это алгоритм должен определить куда бежать, и поиск пути тут никак не помогает
alexanya11
> Пустая ячейка, находящаяся на максимальном удалении от врагов - цель.

Ну если сущность попадает на карту, она явно туда попадает зачем-то - добраться до некоего здания/особого врага/выхода на другую карту...

tacПостоялецwww5 дек. 201719:41#14
MANAB
> она явно туда попадает зачем-то - добраться
чтобы убегать от врагов ... не стоит наделять задачу тем, чего в ней нет
Страницы: 1 2 Следующая »

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

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