Воскресенье, 17 Ноября 2024, 20:36

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Проблема с ИИ для игры
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
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг