Творец. День четвёртый. Мозг в коробке

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

Точно такое же тошнотворное состояние, как при виде «болваночных» (см. статью про физический движок) вражеских юнитов, вызывает у нас лицезрение «тормозящих» ботов в CS. Причём, тормозящих не из-за каких-то низких системных характеристик компьютера, а из-за слишком маленького по развитию головного мозга этих самых ботов, а на самом деле – и мозга разработчиков. Да впрочем, будь вы хоть сам Альберт Эйнштейн, создание интеллекта, мало-мальски похожего на человеческий (хотя бы на уровне общения) займёт у вас годы. Но ведь мы-то с вами – гении почище Альберта (по крайней мере в области ИТ), да и задачка перед нами стоит куда как проще: всего-навсего создать модель поведения среднестатического монстра, агрессивно реагирующего на появление нашего незадачливого ГлавГероя.

Open Мозг
Тут нам наш любимый движок GLScene предоставляет полную свободу выбора. То есть говорит: «Ладно, ребята, и так уже вам «за бесплатно» много чего дадено, поэтому напрягите извилины и родите, наконец, что-нибудь своё». Под «своим» разработчики GLScene подразумевали искусственный интеллект всех персонажей, за которых отвечает компьютер (а точнее, код нашей игры). Разработка интеллекта на первом этапе сводится к двум простым вопросам: «Что за интеллект и для чего мы его делаем?» и «А нужен ли он нам вообще?»

Вот простой пример. Собралась группа разработчиков писать стратегию. Всё уже готово, осталось только вразумить электронных противников и вселить в них боевой дух. Что могут разработчики (могут – не значит сделают)? Они могут разработать абсолютную копию живого человека, напичкать его знаниями боевых навыков, провести курс молодого бойца и научить пользоваться оружием. Затем насоздавать 10 тысяч копий и пустить их на виртуальное поле сражения. А, ну да, нужно ещё сказать им, против кого они будут бороться. Этот путь универсален. То есть, в зависимости от жанра игры, разработчики просто поменяют знания противников и снова выпустят их «на свободу».
Второй путь. Разработчики берут противника и скриптуют его действия от первого до последнего дня его виртуальной жизни. То есть бот выполняет лишь определённые алгоритмы (в зависимости от внешний условий). Этот путь предполагает разработку скриптов для каждой игры в отдельности. Иными словами, девелоперы будут чесать свои головы каждый раз, как сядут писать новую игру.

Мы пойдём своим путём
Каждый разработчик представляет поведение вражеских юнитов в своём игровом мире по-разному. Возможно, и наши с вами мнения разойдутся, однако я предложу свой вариант.
Все функции, отвечающие за ИИ, мы вынесем в отдельный модуль, который позже можно будет переносить в другие проекты (не писать же каждый раз всё заново).

Итак, в IDE Delphi выполняем «File – New – Other», в открывшемся окне выбираем вариант «Unit». Само собой, в этом модуле не будет никакой формы, а значит, мы не можем создавать здесь компоненты GLScene. Однако из этого модуля мы можем использовать объекты, описанные в основном файле проекта. Для этого в локальный раздел uses нового модуля добавьте имя файла с главным окном (по умолчанию это Unit1). Теперь из нового модуля можно будет обратиться к объектам основного окна. Но чтобы использовать все возможности движка GLScene, нам необходимо подключить к нашему модулю ИИ ещё несколько файлов. Для этого дополнительно впишем в uses следующие имена модулей: Graphics, GLTexture, GLScene, GLObjects, GLGeomObjects, GLVectorFileObjects, Jpeg и VectorGeometry.
Сохраняем наш юнит в папке с игрой под именем Intellect и вписываем это название в uses основного проекта.
Теперь из вновь созданного модуля мы можем вызвать любую процедуру главного окна или движка GLScene: перемещение в состоянии покоя, реакция на уменьшение собственного здоровья, поиск игрока на карте или что-нибудь подобное. Мой вариант действий противников ищите в исходнике игры, который, напомню, можно скачать в файловом архиве нашего форума.
Да, кстати! Не забудьте добавит обработку символа «e» в функцию, отвечающую за загрузку уровня. Этот символ будет обозначать у нас первый тип монстров, так что при обнаружении каждого вхождения такой буквы в файле с картой уровня создавайте нового потомка GLActor для GLWorld.

Пуля-дура
Ну что ж, монстры готовы, осталось придумать способы истребления мутировавших инопланетных негодяев. Будем пользоваться дедовским методом: пулей и штыком. Но об этом – в следующий раз.

Продолжение следует...

Рекомендуем почитать: