|
Искусственный интеллект
В предыдущей главе вы познакомились с простым примером перемещения объектов. Но на практике траектории движения могут быть достаточно сложными, иногда с участием более, чем одной динамической кисти. Например, паук и его паутинка, хотя вместе они двигаются, как единое целое.
Поскольку некоторые объекты движутся и по более сложным траекториям, это создает впечатление наличия у них интеллекта, что условно можно назвать искусственным интеллектом (A.I. - artificial intelligence). Разумеется, эта 'разумность' ненастоящая, и все их движения просто запрограммированы. Хотя, в сложных играх, когда, скажем, птица целенаправленно охотится за игроком, это создает впечатление ее разумности.
Теперь давайте вспомним о примерах с летучей или простой мышью из предыдущей главы. Если у вас 10 подобных мышей, движущихся одинаковым манером, но в разных местах карты, то при реализации их обработчиков 'в лоб', вам понадобится 10 динамических кистей, и 10 колбеков для каждой комнаты, в которых перемещаются мыши. Но можно поступить проще, и написать одну функцию UpdateBut или UpdateMouse, получающую в виде параметра индекс или id динамической кисти, которую вы хотите обновлять.
Назовем такие функции - функциями искусственного интеллекта. В основном это функции класса обновления (update). Хотя, так же в обработку искусственного интеллекта могут входить функции инициализации (init), которые вызываются при входе в определенную комнату. Некоторые общеупотребительные функции искусственного интеллекта уже реализованы в файле ai.gs, но при желании вы можете туда добавить и свои собственные обработчики.
Иногда интеллект от функции требуется довольно простой, как в случае с летучей или обычной мышью. Но бывают обработчики и гораздо более сложные. Представьте себе эффект пузырьков воздуха, появляющихся, когда игрок находится под водой. В нем используется целый набор динамических кистей, отображающих пузырьки, а их появление и движение зависит от многих параметров, таких как позиция игрока, наличие воды, подводной маски и т.д.
Теперь давайте рассмотрим наиболее часто встречающиеся объекты искусственного интеллекта.
Пауки и веревки
Паук перемещается вверх и вниз между двумя заданными позициями, наподобие своего прототипа из классических игр про Диззи. А его паутинку можно реализовать с помощью функции веревки.
|
Паук
Реализуется с помощью динамической кисти, обновляемой через функцию AIUpdateSpider(idx). Эта функция перемещает объект вверх и вниз между двумя координатами, заданными в свойствах O_USER и O_USER+1. Свойство O_STATUS используется для сохранения направления движения, 0 - вверх, 1 - вниз.
|
Обработчик веревки может изменять высоту объекта-веревки так, чтобы доставать до другого заданного объекта, находящегося под ней. Это выглядит, как веревка или паутина, на которой что-то висит типа лифта или паука. Удобство такой функции в том, что когда объект назначения перемещается вверх или вниз, объект-веревка будет автоматически перерисован на нужную высоту.
|
Веревка
Веревка представлена в виде динамической кисти, обновляемой через функцию AIUpdateChainLink(idx). Эта функция изменяет высоту объекта-веревки так, чтобы доставать до заданного объекта назначения, находящегося под ней. Объект назначения задается указанием его id в свойстве O_TARGET объекта-веревки.
|
Теперь давайте попробуем добавить паука на паутинке в прилагающийся пример.
Добавим объект паук (tile=164, x=528 y=232, color=red, type=dynamic, id=1000, collider=call handler, class=hurt). Установим свойство O_USER (#32) равным 216, задав тем самым верхнюю y-координату траектории, а свойство O_USER+1 (#33) установим равным 248, задав, соответственно, нижнюю координату.
Так же добавим объект-веревку, отображающий паутинку, заданную через спрайт пунктирной линии (tile=112, x=536, y=208, w=1, h=24, map=4,0,5,8, color=red, type=dynamic, id=1001, collider=none, class=none, target=1000).
Сохраним карту, и добавим следующие колбеки. Запускаем игру и появляется движущийся паук.
Траектории
Обработчик траектории позволяет объекту двигаться по определенному маршруту, как это делает, скажем, лифт, зверь или птица. Движение само по себе аналогично движению мыши из предыдущей главы, но сама траектория может быть более сложной, чем просто движение туда-сюда.
|
Траектории
Траектория задается с помощью динамической кисти, и обновляется функцией AIUpdateTrain(idx). Данная функция перемещает объект по траектории, заданной группой специальных объектов, называемых ключевыми точками (waypoints).
Свойство O_STATUS определяет, движется объект (1) или нет (0).
Свойство O_TARGET содержит id ключевой точки, в которую необходимо переместиться. Когда ваш объект достигает ключевой точки, новая ключевая точка прописывается в свойстве O_TARGET, и движение продолжается к ней. id новой ключевой точки прописано в свойстве O_TARGET текущей ключевой точки
Таким образом, все ключевые точки связаны в единую цепочку, в которой каждая точка указывает на последующую. Если конечная ключевая точка указывает на первую, то траектория зацикливается.
Свойства O_USER и O_USER+1 ключевой точки (также называемые O_WAYPOINTSPEED и O_WAYPOINTFLIP) хранят информацию о скорости движения объекта и о том, необходим ли зеркальный поворот спрайта при достижении данной точки.
Ключевые точки обычно рисуют невидимыми для игрока, устанавливая свойство O_DRAW равным 0. Класс ключевой точки устанавливать не обязательно, но желательно для удобства, чтобы в дальнейшем не забыть о назначении объекта.
|
Давайте рассмотрим пример объекта, перемещающегося по траектории. Добавим объект платформу на слой 0 (x=576, y=248, w=32, h=8, tile=125, map=0,56,32,64, color=yellow, type=dynamic, id=1010, collider=hard, status=1). Установим точку назначения target=1011.
Теперь добавим первую ключевую точку на слой 7 (x=576, y=248, w=8, h=8, tile=0, color=magenta, type=dynamic, id=1011, draw=0, class=waypoint). Для нее установим точку назначения target=1012, и свойство O_USER, определяющее скорость перемещения, равным 2. Вторую ключевую точку добавляем таким же способом, как и первую, но задаем y=176, id=1012 и точку назначения target=1011.
Добавим следующие вызовы в функцию обновления комнаты и запустим игру.
Разумеется, функции искусственного интеллекта, идущие в комплекте - это всего лишь отправная точка для построения ваших собственных алгоритмов. Ваш выбор - использовать ли только эти функции, или же написать свои собственные, более точно отражающие потребности вашей игры. Прилагаемые функции и аннотации к ним вы можете найти в файле ai.gs. Попробуйте разобраться сами, как они работают.
Домашнее задание
Добавьте в траекторию перемещения платформы еще две ключевые точки, размещенные в следующей комнате, чтобы получилась траектория в виде прямоугольника. Третья точка будет на той же высоте, что и вторая, но ее горизонтальная координата должна находиться где-то в другой комнате. Четвертая точка будет находиться под третьей на уровне земли, как и первая. Сделайте правильные связи между точками. Добавьте еще одну функцию обновления для второй комнаты и не забудьте активировать через ObjPresent объект платформы, т.к. он перемещается из одной комнаты в другую.
Здесь можно посмотреть возможное решение.
|
|