Деревья поведения в libgdx-ai: реактивные прерывания и фиксированное поведениеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Деревья поведения в libgdx-ai: реактивные прерывания и фиксированное поведение

Сообщение Anonymous »

Я новичок в game-ai и пытаюсь реализовать вражеский ИИ в игре libGDX, используя деревья поведения libgdx-ai.
У врага есть несколько состояний, основанных на осведомленности, управляемых непрерывным значением подозрения (0,0 .. 1,0), исходящим от системы восприятия (шум, зрение и т. д.).
государства высокого уровня:
  • Код: Выделить всё

    COOL / PATROL
    [/b]
    Поведение по умолчанию при незначительном подозрении.
  • Код: Выделить всё

    INVESTIGATE
    [/b] (≈ подозрительность 0,2 – 0,4)
    Противник перемещается к последней известной позиции раздражителя и производит короткие следственные действия.
  • [/b] (≈ подозрительность 0,4 – 0,6)
    Более активное поисковое поведение (оглядывание, сканирование, ожидание).
  • [/b] (≈ подозрение > 0,6)
    Полностью реактивное преследование игрока.
ИИ должен реагировать вверх:
  • Если игрок опознан в любой момент, противник должен немедленно прервать все, что он делает, и переключиться на ПОГОНИ.
Но он должен совершить движение вниз:
  • Как только враг начнет ИССЛЕДОВАТЬ или ПОИСК, он должен завершить небольшую последовательность действий (двигаться → смотреть → ждать и т. д.), прежде чем вернуться в режим ХОЛОД.
  • Он не должен переключаться между состояниями в каждом кадре только потому, что подозрения слегка колеблются.
Настройка текущего дерева поведения
Корневой узел — это динамический GuardSelector, примерно такой:

Код: Выделить всё

root
dynamicGuardSelector
(identified?) sequence
chase

(suspicious?) sequence
search
wait ...

(irritated?) sequence
investigate
wait ...

$idlePatrolLoop
Каждая ветвь содержит либо одно действие, либо небольшую последовательность.
Основная проблема
dynamicGuardSelector обеспечивает реактивность, которую я хочу, но очень затрудняет обязательство:
  • Защитники переоцениваются каждый тик.
  • Ветви с более низким приоритетом могут быть прерваны в любой момент.
  • Если действие или последовательность зависят от флагов или таймеров, установленных в enter()/exit(), прерывания могут привести к:

    таймеры будут сброшены навсегда
  • код очистки никогда не запустится
  • «липкие» состояния (например, isInvestigating никогда не становятся ложными)
  • или наоборот: потеря связи между шагами последовательности

Я попробовал несколько подходов:
  • Декораторы в стиле защелки
    />
  • Логические значения Blackboard (isInvestigating, isSearching и т. д.)
  • Начать/завершить действия вокруг последовательностей
Все эти методы работают частично, но кажутся хрупкими или трудно масштабируемыми по мере роста числа состояний и действий.
Что я пытаюсь сделать Достичь (концептуально)
Мне нужен ИИ, который:
  • Немедленно реагирует на события с более высоким приоритетом.
  • Выполняет действия с более низким приоритетом достаточно долго, чтобы выглядеть намеренно.
  • Может быть состоит из множества небольших действий без хрупкой логики флагов.
  • Достаточно хорошо масштабируется по мере увеличения количества состояний и действий.
Другими словами: «Реагировать на подъем, совершать на пути вниз».
Как это обычно решается в libGDX / libgdx-ai?
Как вы обычно моделируете прерываемое, но обязательное поведение без создания хрупкой логики пользовательского состояния?
Будем очень признательны за любые архитектурные рекомендации или примеры.

Подробнее здесь: https://stackoverflow.com/questions/798 ... -behaviors
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»