Советы от Майкла Макграта на примере игры Red Baron II

Red Baron II - типичный пример избытка технических переделок и недостатка предвидения в процессе разработки. В Red Baron 3D большая часть программистской работы состояла в вылавливании ошибок и попытках разобраться в коде, чтобы мы могли добавить в игру новые возможности и технологии. Когда началась переработка Red Baron 3D, создававшие игру инженеры или уже покинули Dynamix, или перешли в другие проекты. Код был плохо документирован, из-за чего мы столкнулись с нескончаемыми трудностями, связанными с его переработкой, и не было никого, кто мог бы помочь в нем разобраться. Переделать игру было бы гораздо проще (я уверен, что первоначальной команде это было по силам), если бы программа была хорошо структурирована. Но код, будучи плодом труда многих и многих людей, которые совсем не заботились о том, чтобы снабдить его хоть сколько-нибудь приличным описанием, был ужасающе загадочен. В дополнение к этому, в тех местах, где проект все-таки был хорошо продуман, код был сверхабстрактен и сверхтехничен.

Игре Red Baron II очень не повезло. Изначально разработанная под DOS, позже она переделывалась сначала под Windows 95, потом под DirectX и, наконец, под 3D-платы. В итоге код игры перекраивался столько раз, что под конец стал невообразимо громоздким. Основная проблема заключалась не в самой реконструкции, а скорее в том, что технология привела, как оказалось, к «переоценке» возможностей повторного использования кода и нарушению модульности. Вырезая некоторые части, приходилось сохранять остальные, склеивая их кое-как. В результате программу стало очень трудно читать и понимать. Если бы код с самого начала был хорошо продуман и выстроен по модульному принципу, то игра могла быть завершена гораздо быстрее, независимо от преимуществ технологии, которые вдохновляли на внесение изменений. Не следует понимать это утверждение в том смысле, что «нужно было использовать Си++». Мы пользовались этим языком. Однако объектно-ориентированное программирование со всеми его достоинствами может стать настоящим кошмаром при злоупотреблении плохо продуманным проектом и применением техники «заплаток». Никогда не позволяйте «завораживающим» возможностям языков программирования убедить вас, что соблюдение принципа «бритвы Оккама» и удобочитаемость программы уже не существенны. Никогда.

Уильям Оккам, философ, живший в 13-14 веках, вывел закон экономии, известный сегодня как «бритва Оккама». Вот его формулировка: следует отказываться от понятий, не являющихся необходимыми.

В дополнение к общению с другими специалистами через Usenet и посещению различных конференций Майкл Макграт предлагает несколько полезных книг, на которые стоит обратить внимание желающим заняться программированием игр:

• Computer Graphics: Principles and Practice, Second Edition in С. Авторы Foley, van Dam, Feinern Hughes (Addison-Wesley, 1996)

• Руководство по программированию («красная книга») и справочник OpenGL («синяя книга»)

• Серия The Graphics Gems, под редакцией Andrew S. Glassner, James Arvo, David Kirk, Alan W. Paeth и Paul S. Heckbert (Academic Press и АР Professional, 1993-1995)

• Artificial Intelligence. Автор Patrick Henry Winston (Addison-Wesley, 1992)

В настоящее время Майкл Макграт занят написанием программного кода для игр Desert Fighters и Aces of the Pacific II, а в его планах на будущее - переписать Netrek и возобновить участие в создании научно-фантастических боевых летных симуляторов и стратегических игр.

Аллен Джексон (Allen Jackson), Origin Systems

Аллен Джексон работал в компании Origin в течение ряда лет, и ему посчастливилось принимать участие в создании многих экшен-игр и космических симуляторов, отмеченных разнообразными наградами. В их числе: Crusader: No Remorse, Crusader: No Regret, Wing Commander Prophecy и Wing Commander Prophecy: Secret Ops. В первую очередь Аллен имеет дело с игровым кодом высокого уровня, а именно с разработкой интерфейса, приложениями Win32 GUI, объектами, определяемыми в игре, и сетевыми вопросами.

В данном разделе Аллен Джексон делится тремя советами по написанию кода для игр, ссылаясь при этом на свои последние работы, на практике подтверждающие предлагаемые рекомендации.

Используйте движок, управляемый данными

Ядро игры должно, насколько это возможно, работать на основе данных. Вместо того чтобы корпеть над каждым отдельным эпизодом игры, предоставьте программе самой подобрать нужную комбинацию элементов. Например, космические корабли в Wing Commander: Prophecy в основном создавались как элементы данных. Программисты определяют общие свойства кораблей: двигатель, пушки, ракеты, щиты и максимальное ускорение. Затем дизайнеры собирают файл данных корабля, который описывает его внешний вид, свойства и статистику. Этот файл будет позже прочитан с жесткого диска и проинтерпретирован программой. Лишь иногда программа ищет конкретный корабль для применения специальных эффектов, но в идеале и эти случаи следует убрать из кода, чтобы все корабли могли обладать теми или иными свойствами.

Еще один способ представить движок на основе данных - это система триггеров, привязанных к карте. Главный герой Crusader: No Remorse - десантник далекого будущего, бегающий по изометрической карте и расстреливающий врагов. Карта заполнена объектами, с которыми наш морпех может взаимодействовать, - телепортерами, дверями, выключателями и мониторами. Система позволяет дизайнеру выбрать определенный триггер (например переключатель) и присоединить к нему команду, например «открыть дверь №21». Эта связь сохраняется в файле карты и интерпретируется программой во время выполнения. Если система триггеров создана правильно, она позволит активизировать множество действий, в том числе и те, которые не были изначально запланированы.

Миссии тоже, по возможности, должны управляться данными. Программа не должна знать, какие конкретно миссии используются в сюжете, ей достаточно иметь каркас, позволяющий дизайнеру создавать сценарии кампаний и отдельных миссий, - то, с чем имеет дело конечный пользователь, игрок. Проектировщик миссий и сюжета Wing Commander: Prophecy позволяет дизайнерам создавать файлы «сериалов», которые содержат указатели общего сюжета, наборы миссий и древовидную структуру, связывающую все миссии воедино. Такая система чрезвычайно гибка и надежна, она позволяет создавать разные типы ветвей дерева и условий, что приводит к многообразию сюжетов.

Экспериментируйте с существующими движками

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

В Интернете существует множество прекрасных графических движков, готовых к употреблению. Загрузите любой и попытайтесь создать с его помощью простое приложение. Затем постарайтесь разобраться, какая архитектура заложена в движок. К примеру, существует множество вариантов прорисовки сцен. Некоторые движки позволяют создавать игровые объекты, а затем добавляют или удаляют их при прорисовке. Другие предпочитают, чтобы объекты сами себя рисовали с помощью класса screen. Третьи движки одновременно прорисовывают несколько сцен, используя систему окон. Наконец, некоторые программы накладывают объекты на сцену слоями в особом порядке, оставляя основной экран интерфейса самым последним, чтобы он всегда был виден.

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

Один из примеров предложения исходного кода игры через Интернет - продукция компаний Raven Software и Activision, опубликовавших исходные тексты Heretic и Hexen для бесплатного использования. Загрузить их можно с узла www2.ravensoft.com/source. Не стала прятать свои исходные коды и id Software, выложившая в Интернет код Quake.