» » » Создание AI для персонажа (M.U.G.E.N 1.0+)

Создание AI для персонажа (M.U.G.E.N 1.0+)

Категория: M.U.G.E.N / Учебник M.U.G.E.N
рейтинг 4,3 из 5
  • Добавил: Wolf_Stak
  • Дата: 19-10-2016, 14:37
  • Просмотры: 567
  • Отзывы: 25
  • Автор: Wolf_Stak

  • Внимание: Данный файл предоставлен для бесплатного скачивания всем пользователя Муген проекта. Пожалуйста отблагодарите автора комментарием и подпиской на наш проект.

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

    В этом уроке мы будет создавать AI(искусственный интеллект) для персонажа.
    Кроме этого, мы создадим множитель AI, который будет влиять на агрессию AI учитывая выставленную в движке сложность.

    Гайд написан для движка версии 1.0 и выше. Конечно же можно использовать способ создания AI из этого гайда, но он уже просто банально устарел и имеет ряд недочетов так как в версии движка 1.0 и выше появилась офф поддержка AI, и был внедрен триггер "AILevel", его мы и будем использовать.
    Для тех кто не знает AI автоматически активируется при прохождении аркадного режима. Для ручного включения/выключения AI, во всех режимах кроме тренировочного, необходимо нажать такую комбинацию клавиш: "ctrl+номер игрока(от 1 до 4)",можно и через консоль(ctrl+тильда) через комманду: "toggleai номер игрока(от 1 до 4)". В тренировочном режиме AI активируется в опциях,которые вызываются клавишей: "Pause/Break"

    Итак, приступим.


    Для начала необходимо создать функцию включения и выключения AI с помощью переменной в ".cmd" файле.Чаще всего используют последнюю доступную переменную "59",так как в мугене их колво идет от "0" до "59",в моем хаке это изменено с "59" до "101", в принципе можно использовать любую переменную, главное чтобы вы не использовали её для того для чего она не предназначена вами. Можно конечно просто использовать триггер "AILevel", на проверку наличия включенного AI,но мы так делать не будем, всегда же лучше самому рассчитывать когда AI должен быть включен, а когда нет.

    Включение:
    
    
    [State -1, Ai On]
    type = VarSet
    triggerall = Var(59) < 1; проверка, является ли  значение переменной "59" меньше 1.
    triggerall = RoundState = 2; проверка на стадию раунда: 1-начальная стадия раунда(интро) , 2-стадия боя, 3-конечная стадия раунда(победная,ничья,и тп позы)
    trigger1 = AILevel > 0;проверка на наличие активированного AI, 0-выключен,1-8-включен
    trigger1 = ctrl=1; проверка на способность персонажа реагировать на команды управления
    v = 59
    value = 1;задаем значение переменной "1",тобишь включаем.
    ignorehitpause = 1
    
    


    Выключение:
    
    
    [State -1, Ai Off]
    type= VarSet
    trigger1 = var(59) > 0;проверка является ли значение переменной "59" больше "0"
    trigger1 = RoundState != 2; проверка на стадию раунда,если она не является равной "2"(стадия боя),то триггер срабатывает.
    trigger2 = !AILevel||life<=0||Win||Lose||DrawGame; сработает если AI автоматически выключится, либо если умрет, выиграет, проиграет, а так же, если будет ничья.
    v = 59
    value = 0
    Ignorehitpause = 1
    
    


    С функцией вкл/выкл закончили, теперь создадим множитель агрессии AI который будет зависеть от выставленной сложности в движке, в стейт "-2" пихаем это:
    
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = 1
    v = 58    
    value = abs(ailevel/2)
    ignorehitpause = 1
    
    
    


    Конечно можно и вручную задать множитель агрессии для каждого уровня сложности, так:
    
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = 1
    v = 58    
    value = cond(ailevel=1,1,cond(ailevel=2,2,cond(ailevel=3,3,cond(ailevel=4,3.5,cond(ailevel=5,4,cond(ailevel=6,4.5,cond(ailevel=6,5,cond(ailevel=7,5.5,cond(ailevel=8,6,1)))))))))
    ignorehitpause = 1
    ;Важное примечание: оператор "cond" доступен только в версии движка 1.1, для версии движка 1.0 используйте оператор "ifelse"
    
    


    Или так:
    
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=1
    v = 58    
    value = 1
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=2
    v = 58    
    value = 2
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=3
    v = 58    
    value = 3
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=4
    v = 58    
    value = 3.5
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=5
    v = 58    
    value = 4
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=6
    v = 58    
    value = 4.5
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=7
    v = 58    
    value = 5
    ignorehitpause = 1
    
    [State 0, VarSet]
    type = VarSet
    trigger1 = ailevel=8
    v = 58    
    value = 6
    ignorehitpause = 1
    
    


    Выбирайте тот способ который вам удобнее.

    Множитель создали,осталось только создать функции вызовы стейтов для ручного управления и AI.
    Ниже будут два примера:

    1.Вызов стейта для неактивного AI:
    
    
    [State -1, Punch]
    type = ChangeState
    value = 200
    triggerall = var(59)=0;проверка на вкл/выкл AI,в данном случае проверка на активность выключенного AI.
    trigger1 = command = "a"
    triggerall = statetype = S
    triggerall = ctrl
    
    


    2.Вызов стейта для активного AI:
    
    
    [State -1, Ai-Punch]
    type = ChangeState
    value = 200
    triggerall = var(59)=1&&numenemy;проверка на вкл/выкл AI,в данном случае проверка на активность включенного AI, ну и проверка на наличие соперника
    triggerall = statetype = S;проверка на тип стейте, в данном случае удар выполняется "на земле", значит тип "S".
    triggerall = ctrl;параметр служит для того, чтобы AI не могу вызывать данный стейт из любого другого.
    triggerall = pos y>=0;используется для атак "на земле" так как иногда даже "воздушный" стейт может иметь тип "S"
    trigger1 = playerid(enemynear,id),p2dist x<90;проверка на дистанцию по x
    trigger1 = playerid(enemynear,id),p2dist y<90;проверка на дистанцию по у
    trigger1 = random <40*var(58);частота срабатывания будет возрастать в зависимости от выставленной сложности,для 50% срабатывания нужно выставить число "499", так как отсчет начинается с "0",а для 100% значение "999".
    
    


    Для комбо ударов достаточно добавить такие триггеры:
    
    
    trigger1 = stateno = ваш номер стейта с которого продолжится цепь ударов; можно использовать так же: prevstateno-проверка на предыдущий стейт вашего персонажа.
    trigger1 = movecontact; можно так же использовать так же: movecontact, movereversed. Все зависит от личных нужд ну и типа удара.
    
    


    Разумеется можно использовать любые другие триггеры проверки, все зависит от личных нужд ну и от самих типов ударов/спешлов и тп. Важно только то что, нужно проверять что будет отведено AI.а что для игрока, "var(59)=0"-для игрока, "var(59)=1"-для AI.

    Я рекомендую отключить комманды: "вперед", "назад", "вниз", "вверх" для AI, для избежания багов.
    
    
    [State -1, Ai-Disable 'Up']
    type = ChangeState
    value = 0
    triggerall = var(59)=1
    trigger1 = ctrl && var(59) && (command = "up" || command = "holdup")
    trigger1 = stateno!= 40 && stateno <= 20 && !(Pos Y + Vel Y)
    
    [State -1, Ai-Disable 'Down']
    type = ChangeState
    value = 0
    triggerall = var(59)=1
    trigger1 = ctrl && var(59) && (command = "down" || command = "holddown")
    trigger1 = (stateno != [10, 12]) && stateno <= 20 && !(Pos Y + Vel Y)
    
    [State -1, Ai-Disable 'Forward']
    type = ChangeState
    value = cond(pos y<-5,50,0)
    triggerall = var(59)=1
    trigger1 = ctrl && var(59) && (command = "fwd" || command = "FF")
    trigger1 = (stateno != [100, 107]) && stateno <= 20 && !(Pos x + Vel x)
    
    [State -1, Ai-Disable 'Back']
    type = ChangeState
    value = cond(pos y<-5,50,0)
    triggerall = var(59)=1
    trigger1 = ctrl && var(59) && (command = "back" || command = "BB")
    trigger1 = (stateno != [105, 106]) && stateno <= 20 && !(Pos x + Vel x)
    
    


    Дополнительно я приведу вам примеры вызова стейтов блока для AI:
    
    
    [State -1, Ai-Guard st]
    type = ChangeState
    value = 130
    triggerall = var(59)=1&&numenemy&& statetype!=A
    triggerall = playerid(enemynear,id),hitdefattr=SCA,NA,SA,HA,NP,SP,HP,NT,ST,HT&&inguarddist
    triggerall = random <5*var(58)
    trigger1 = ctrl
    trigger2 = stateno=52
    
    [State -1, Ai-Air guarding]
    type = ChangeState
    value = 132
    triggerall = var(59)=1&&numenemy&& statetype = A 
    triggerall = playerid(enemynear,id),hitdefattr = SCA,NA,SA,HA,NP,SP,HP,NT,ST,HT && inguarddist
    trigger1 = random <5*var(58)
    trigger1 = ctrl
    
    [State -1, Ai-Guard cr]
    type = ChangeState
    value = 131
    triggerall = var(59)=1&&numenemy&& statetype != A 
    triggerall = playerid(enemynear,id),hitdefattr = SCA,NA,SA,HA,NP,SP,HP,NT,ST,HT && inguarddist
    triggerall = random <5*var(58)
    trigger1 = ctrl
    trigger2 = stateno = 52
    
    


    Надеюсь гайд был познавательным и помог в чем то.
    Всего наилучшего!

    Статус раздачи: Активна
    Раздают: 108 Качают: 23 Размер: 708,24Mb Скачали: 36 раз(а)
    Имя файла: Создание AI для персонажа (M.U.G.E.N 1.0+).torrent
    Последняя активность: октябрь 19, 2016, 2:37 pm
    Похожие материалы
    Отзывы пользователей
    off
    • Написал: Manoichi
    • Дата: 19 октября 2016 15:20
    Действительно хорошо проделанная работа. Лайка тебе большой.
    Ответить
    off
    • Написал: RockNGame
    • Дата: 19 октября 2016 15:47
    Ого! Действительно написал! Ну спасибо однако. Ладно, большое спасибо. smirk
    Ответить
    off
    • Написал: FaNtoM
    • Дата: 19 октября 2016 20:25
    Я до этого не дошел но все равно спасибо
    Ответить
    Ошибка!
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Добавить отзыв
    Ваше имя:*
    Ваш e-mail:*
    • bowtiesmilelaughingblushsmileyrelaxedsmirk
      heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
      winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
      worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
      expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
      disappointedconfoundedfearfulcold_sweatperseverecrysob
      joyastonishedscreamtired_faceangryragetriumph
      sleepyyummasksunglassesdizzy_faceimpsmiling_imp
      neutral_faceno_mouthinnocent
    Введите код:*
    Кликните на изображение чтобы обновить код, если он неразборчив