close

Рабочая программа «Разработка компьютерных игр на движке Godot Engine» Знакомство с Godot Engine и Проект «Pong». Часть 9

9. ИИ соперника

 

Создание нашего Искусственного Интеллекта будет на самом базовом уровне, но для начала немного пару слов о самом ИИ.

Иску́сственный интелле́кт (ИИ; англ. artificial intelligence, AI) — свойство интеллектуальных систем выполнять творческие функции, которые традиционно считаются прерогативой человека (не следует путать с искусственным сознанием, ИС).

 

Мы дадим нашему сопернику базовый интеллект, чтобы он мог следить за мячом. А далее двигаться в направлении мяча. Но так как мы не хотим создавать супер сильного соперника, его легкость будет регулироваться скоростью передвижения.

 

Логика проста: Если мяч находиться выше соперника, соперник двигается вверх, а если ниже, то соперник движется вниз.

Так как мы находимся на сцене уровня, в котором расположены все наши игровые объекты, то давайте переместимся в ветку сцены нашего соперника нажав на этот значок.

Далее к корневому узлу соперника (узел кинематического тела) прикрепим скрипт. Сохраните скрипт там же где сохранена сцена с соперником.

Объявите переменную скорость и задайте скорость в 250 единиц.

Далее мы объявим новую переменную, но присваивать её ничего не будем. Переменная мяч (ball). Мы присвоим значение её позже

Далее запишем следующую конструкцию и разберем её.

В функции «_ready», у нас красуются пару методов. Первый метод «get_parent», что же он делает? Судя по названию он возвращает родителя, а точнее родительский узел. Как можете видите каждый узел имеет родителя, даже наш узел уровня тоже имеет родителя. Статические узлы стен тоже имеют родительский узел в роли нашего узла уровня.

Так вот метод «get_parent» возвращает родительский узел если есть, а если нет возвращает значение «null» что означает отсутствие узла.

Следующий метод «find_node» ищет нужный узел из родительского узла, по имени узла. В нашем случаи, когда запускается игра скрипт соперника ищет родителя, это наш узел сцены уровня, а после находит узел по имени «Ball» и помещает объект в переменную ball.

Теперь в переменой ball находится наш узел мяча «Ball» и мы можем с ним работать.

Теперь опишем физический процесс, поместим метод движение и скольжение объекта. Мы собираемся двигать наш объект имитируя движение живого игрока. Внутрь поместим вектор направления, который будет обнулен. ZERO – сбрасывает вектор до нуля по х и y (0, 0).

Далее мы создадим собственную функцию, не встроенную

Это функция никогда не запуститься пока мы её не вызовем, так встроенные функции будут запускаться в определенные моменты Годота. Это функция будет определять направление соперника, когда ракетка должна двигаться вверх, а когда вниз.

Логика соперника будет проста.

Расстояние мяча и соперника будет измеряться по высоте. Так же дадим фору игроку, мы не сразу будем двигать соперника по высоте мяча, а лишь с не большой дистанции от центра. Запишем такую конструкцию и разберем её.

Метод «position» отвечает за координаты объекта. В этом примере мы обращаемся к координаты мяча по высоте (по оси Y) и дальше вычитаем координаты по высоте ракетки соперника. Да любой объект который вам в будущем понадобиться переместить, можно использовать ключевое слово «position». Математическая функция «abs» превращает любое число находящийся в скобках в положительное число. Если было отрицательное, станет положительным, если было положительным, то так и останется.

Конструкция: abs(ball.position.y – position.y) высчитывает дистанцию между объектами. Позвольте показать.

Таким образом можно вычислять дистанции не только по высоте, но и по горизонтали. А дальше мы сравниваем нашу дистанцию в размере 25 единиц и если дистанция между мячом и ракеткой соперника выше, то мы будем задавать нужное направление, допишем такой код.

Здесь же говориться что если координаты мяча ниже координаты ракетки соперника, то мы будем возвращать 1. Пока примем это к сведению и допишем следующие.

Здесь говориться если мяч ниже ракетки соперника, то будем возвращать 1, а если выше соперника, то будем возвращать -1. Ну и если наравне, то 0.

Не забываем координаты по высоте, по оси Y идет отсчет сверху вниз. Самый верхний край экрана Y равняется 0, а самый нижний возрастает до бесконечности.

Допишем скрипт если дистанция будет ниже зоны видимости соперника.

Возвращение 0 принадлежит первому условию. Ключевое слово return возвращает полученное значение и завершает функцию. Поэтому если условие на 14 строчки было истинно, функция возвратит 1 и завершит эту функцию, игнорируя дальнейший код функции.

Мы создали функцию направления соперника, но куда мы её поместим. Давайте подкорректируем наш вектор и уберем команду ZERO.

Вектор имеет парные значения Х и Y, так что мы можем напрямую указывать направления через скобки. К примеру Vector(0, -1) будет приравниваться к Vector.UP или position.y += -1, что будет перемещать объект по высоте вверх, вы так же можете указывать и по Х.

А так как наша функция get_opponent_direction() возвращает числовое значение (направление) виде 1, или -1  или 0, то мы можем умножить на скорость соперника, для того чтобы заставить его двигаться.

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

Логика соперника проста, и игра уже обретает динамику.

В следующем разделе мы будем сбрасывать мяч если он вылетел за область экрана.

Категория: Разработка игр на Godot Engine | Добавил: Doctor_Bug (10.12.2022)
Просмотров: 14 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar