Проблема с ИИ для игры
|
|
Zazaza | Дата: Воскресенье, 06 Ноября 2016, 19:05 | Сообщение # 1 |
был не раз
Сейчас нет на сайте
| Здравствуйте, мне нужна помощь по написанию ИИ для игры. Суть такова: ИИ должен просто передвигаться по локации, при виде игрока ускоряться и двигаться за ним для того чтобы поймать(или можно сделать изначально, чтобы он двигался с одной скоростью, которая просто будет выше скорости игрока). Внешним примером такого ИИ(да и геймплея) могут послужить враги из старенькой игры на NES "Home alone". Заранее спасибо.
Сообщение отредактировал Zazaza - Воскресенье, 04 Декабря 2016, 15:52 |
|
| |
Rean | Дата: Воскресенье, 06 Ноября 2016, 21:10 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Вариантов масса. Один из:
Код класс Враг { число ИсходнаяТочка = исходная_точка; число ЗонаВидимости = нужное_расстояние; число Скорость = стартовая_скорость; bool Преследую = false; bool Возвращаюсь = false; // аналог игрового цикла для Врага функция ВрагОбновление { Враг.ИдтиВперед(Скорость);
Если (( Враг.Возвращаюсь ) И ( Враг.Х != Враг.ИсходнаяТочка )) тогда return; Иначе Враг.Возвращаюсь = false; Если (( Расстояние(Игрок.X, Игрок.Y, Враг.X, Враг.Y) <= Враг.ЗонаВидимости ) И ( Враг.Направление == направление_в_сторону_игрока )) тогда { Если ( !НЕ Враг.Преследую ) тогда Враг.НачатьПреследование(); } Иначе Если ( Враг.Преследую ) тогда { Враг.Преследую = false; Враг.Возвращаюсь = true; Враг.Направление = противоположное_направление; Враг.Сокрость = стартовая_скорость; Враг.Анимация = анимация_патрулирования; } Иначе Патрулировать(); }
функция Патрулировать() { // Выполняется патрулирование: от точки к точке, либо в заданных рамках, либо до столкновения с препятствием // Как пример Если (Враг.Х >= правый_предел ИЛИ Враг.Х <= левый_предел) Враг.Направление = противоположное_направление; }
функция НачатьПреследование() { Врга.Преследую = true; Враг.Скорость = новая_скорость; Враг.Анимация = анимация_преследования; }
"Выпал" кусочек кода, добавил.
Сообщение отредактировал Rean - Воскресенье, 06 Ноября 2016, 21:45 |
|
| |
Zazaza | Дата: Воскресенье, 06 Ноября 2016, 21:27 | Сообщение # 3 |
был не раз
Сейчас нет на сайте
| спасибо большое, буду разбираться
|
|
| |
Rean | Дата: Воскресенье, 06 Ноября 2016, 21:39 | Сообщение # 4 |
участник
Сейчас нет на сайте
| Zazaza, если будут какие вопросы - задавай. Забыл написать суть алгоритма: Враг патрулирует с начальной скоростью в пределах некоторого значения координаты X. Если Игрок подходит близко к Врагу (так называемая, ЗонаВидимости), и при этом Враг повернут лицом к Игроку - Враг начинает преследовать Игрока. Если Игроку удалось сбежать, то Враг возвращается на исходную точку.
Алгоритм не отслеживает один момент: когда Враг возвращается назад, подойти к нему и перепрыгнуть его, то Враг не начнёт преследование, пока не вернётся на исходную точку. Но это достаточно легко исправить, внеся некоторые поправки.
Сообщение отредактировал Rean - Воскресенье, 06 Ноября 2016, 21:39 |
|
| |
Zazaza | Дата: Воскресенье, 06 Ноября 2016, 21:44 | Сообщение # 5 |
был не раз
Сейчас нет на сайте
| у меня отсутствует прыжок, всё завязано на собирании ловушек. Они тормозят врага на некоторое время за которое можно сбежать.
квадрат-враг, не квадрат-игрок пикча
Сообщение отредактировал Zazaza - Воскресенье, 06 Ноября 2016, 21:48 |
|
| |
Rean | Дата: Воскресенье, 06 Ноября 2016, 21:50 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Zazaza, в таком случае, по этому алгоритму, Враг просто вернётся на исходную и продолжит патрулировать.
P.S. Графика в игре своя? Очень неплохо смотрится. Напоминает Flashback и Another World.
Сообщение отредактировал Rean - Воскресенье, 06 Ноября 2016, 21:50 |
|
| |
Zazaza | Дата: Воскресенье, 06 Ноября 2016, 21:55 | Сообщение # 7 |
был не раз
Сейчас нет на сайте
| Rean, графоний сделан давно, задник в окне украден(это пока, потом свой сделаю). И я забыл учесть важный аспект, в игре будет много лестниц, как будет реагировать ИИ на них?
Сообщение отредактировал Zazaza - Воскресенье, 06 Ноября 2016, 22:03 |
|
| |
Rean | Дата: Воскресенье, 06 Ноября 2016, 22:15 | Сообщение # 8 |
участник
Сейчас нет на сайте
| Zazaza,
Код Расстояние(Игрок.X, Игрок.Y, Враг.X, Враг.Y) <= Враг.ЗонаВидимости
Данный кусок кода действует по окружности, то есть если Игрок будет ниже, но направление Врага будет в его сторону, то Враг заметит Игрока. Тут уже надо допиливать под конкретные нужды: добавлять проверки по Y
Код ( abs(Игрок.X - Враг.X) <= Враг.ЗонаВидимости ) И (Игрок.Y <= Враг.Y + некоторое_значение ) И (Игрок.Y >= Враг.Y - некоторое значение)
в таком случае Игрок будет замечен, если попадёт в некоторый прямоугольник зрения Врага.
Сообщение отредактировал Rean - Понедельник, 07 Ноября 2016, 01:59 |
|
| |