Алгоритмы используемые в играх.
Игровая карта имеет обычно фиксированный размер. Способ представления разных частей поверхности разными цветами - земли зеленой, пустыни желтой, рек и моря - голубыми, и различных их комбинаций относится к стандартным возможностям 3D-библиотек и поэтому здесь рассматриваться не будет. Попытки вылететь за границы карты либо не разрешены в игре, либо предоставляют возможность лететь, пока есть топливо, но кроме голой поверхности вы не увидите никаких новых предметов.
Основным в игре является массив объектов, участвующих в миссии. Структура отдельного объекта уже упоминалась выше. Он обязательно содержит свои координаты, отсчитываемые от одного из углов карты. Каждый момент времени, когда ваш самолет изменил свои трехмерные координаты, происходит проверка видимости каждого из объектов массива. Для этого после вычисления двумерного образа его угловой размер сравнивается с минимальным ограничивающим значением для необходимости отображения на экране.
Важным моментом в имитаторах этого рода является моделирование стрельбы. Как и в играх типа Arcade появляются новые динамические объекты типа “пуля”. Но в зависимости от типа вооружения в этих структурах появляется новое поле - идентификатор цели. Это необходимо для самонаводящихся ракет, которые должны динамически изменять свою траекторию, преследуя мишень. Еще несколько полей будут характеризовать дополнительные параметры оружия, такие как дальность стрельбы, поражающая способность и т.д.
Некоторые игровые объекты, атакующие самолет героя, программируются иначе. Они в реальности не выстреливают снаряды, живущие в игре, а действуют по иному алгоритму. Когда ваш самолет попадает в поле их контроля, то по заданным вероятностям, меняющимся в зависимости от уровня, просто определяется сам факт поражения вашего истребителя и размеры ущерба. Это, конечно, сопровождается визуальными эффектами - кабина дрожит, экран заволакивают клубы дыма, и звуковыми - грохот взрывов. Например:
{ если i-й танк обнаружил наш объект Main: }
if Tank[i].See( Main ) then
{ если с некоторой вероятностью, зависящей от типа танка, он стреляет и поражает
цель }
if Tank[i].RandFire( Main ) then { внести разрушения в наш объект в соответствии
с разрушительной мощью i-й танка }
Main.Destroy( Tank[i].FirePower );
Для моделирования движения самолетов противника используются специальные алгоритмы преследования, иногда простые, иногда сложные. Вообще тема поведения различных объектов в игре заслуживает отдельного разговора, относящегося к алгоритмам искусственного интеллекта.
Некоторые имитаторы, делающие упор на боевые схватки с противником, не уделяют большого внимания реалистичности управления самолетом. В то же время в некоторых играх вам потребуется тщательно изучить многостраничное руководство, и иногда настоящие летные инструкции к реальному самолету, чтобы научиться отрывать истребитель от земли и не разбиваться при посадке. Моделирование реалистичного движения самолета достаточно сложно. Надо учитывать массу специфической информации, хорошо знать физику полета и подробные характеристики имитируемых машин. Но все усилия по созданию реалистичных имитаторов, как правило, окупаются сторицей. Сегодня хорошие имитаторы продаются сотнями тысяч копий, и интерес к новым играм этого жанра постоянно возрастает.
Главный объект-самолет содержит поля своих текущих
координат, скорость и направление движения, текущее вооружение и техническое
состояние различных систем.
Мы приведем алгоритм простого имитатора боевого
самолета.
- Выбрать очередную миссию, проинициализировать все начальные значения в игре, установить игровым объектам их координаты и характеристики. Начать полет.
- Переместить самолет, изменить вид из кабины.
- Опросить клавиатуру или джойстик. Если человек ничего не делает, то перейти к п.6.
- Если человек управляет самолетом, то внести коррективы в скорость, направление движения и т.д.
- Если герой выстрелил, то добавить объект “пуля” в список динамических объектов.
- Просканировать список динамических объектов.
Для объектов типа самолет противника: переместиться по алгоритму маневрирования, по заданному закону распределения вероятности вести огонь по самолету героя;
Для наземных объектов типа танк: если самолет героя в зоне обнаружения, то начать огонь по случайному закону;
Для объектов типа пуля: переместиться в новую точку в соответствии с возможностью автоматического преследования;
Если она не пуста, то:
- если в ней поражаемая цель, то изменить характеристики цели (нанести технический урон, вычеркнуть из списка объектов);
- вычеркнуть себя из списка динамических объектов.
- Перейти к п.2.
Самым сложным в этом жанре компьютерных игр является моделирование реальных характеристик самолета, требующее использования достаточно сложных математических методов, грамотное и эффективное использование трехмерных библиотек, а также в ряде случаев моделирование разумного поведения самолетов противника. Попробуем рассмотреть приемы программирования тех или иных деталей авиаимитаторов более подробно. Сначала выделим те критерии оценки, которые относятся к работе дизайнеров, художников, сценаристов и музыкантов, но не программистов:
- Соответствие самолету-прототипу по геометрическим размерам, общему виду (пропорциям), камуфляжу, маркировке, расположению приборов и оборудования в кабине.
- Разнообразие имитируемых самолетов соответствующего исторического периода.
- Соответствие прототипам самолетов противника по внешнему виду, составу вооружения, летным характеристикам.
- Сложность и насыщенность воздушной обстановки.
- Сложность и насыщенность наземной обстановки (объекты своих войск и цели противника).
- Реалистичность изображения наземных целей.
- Логическая последовательность и сложность заданий.
- Специальные (нетиповые) задачи.
- Исторические задания.
- Дружественность интерфейса пользователя при планировании заданий, возможность настройки опций.
- Звуковая имитация.
- Музыка.
- Оцифрованная речь.
- Увлекательность игрового пространства.
- Общая привлекательность графики.
- Простота освоения.
Теперь рассмотрим проблемы, возникающие при программировании других характеристик имитаторов.
- Соответствие прототипу по летно-техническим характеристикам.
- Управление самолетом в полете. Понятие “летно-технические характеристики”
охватывает целую область знаний, выражающихся в конкретных имитаторах параметрами
максимальной скорости и кривыми ее набора, скоростью изменения мощности двигателя,
устойчивости самолета в различных погодных условиях, характеристиках выполнения
поворота, необходимых углах наклона при этом и т.д. Все эти параметры описываются
соответствующими математическими моделями из учебников по авиадинамике, а
сами имитаторы отличаются друг от друга лишь степенью приближения используемых
алгоритмов к реальности.
Понятно, что пока невозможно на IBM PC смоделировать турбулентные потоки вокруг крыла изменяющейся формы, но, с другой стороны, примитивные арифметические методы типа “жму [Up] - скорость увеличивается, жму [Left] - вектор скорости смещается влево” не позволяют сымитировать более-менее реальное движение самолета и пригодны лишь для простых авиастрелялок, не являющихся авиаимитаторами в полном смысле этого слова. - Соответствие прототипу по составу и алгоритмам работы бортового оборудования.
Большинство меняющихся во время полета параметров типа высоты, наклона самолета, количества топлива, наличия вооружения, работы радара и сигнальных устройств зависят от точности и близости к реальности математической модели имитатора, а также полнотой реализации внешнего вида кабины и наличия соответствующих приборов. Например, для моделирования работы высотомера в текст программы, отвечающий за увеличение/уменьшение высоты самолета, вставляется вызов процедуры ShowNewHeight( CurrentHeight ), которая отображает нужным способом - стрелкой или цифрами - текущую высоту CurrentHeight на экране. - Соответствие прототипу по составу и режимам работы бортового радиоэлектронного
оборудования и систем радиоэлектронной борьбы.
Принцип реализации радиолокатора достаточно очевиден. В каждый момент времени, когда в программе происходит вычисление новых координат самолета, проводится сканирование списка динамических объектов и вычисление расстояния от данного объекта до самолета (по теореме Пифагора). Если это расстояние меньше некоего параметра, характеризующего в игре дальность действия самолетного радара, выбираемого из соображений максимального соответствия прототипу, то на экране локатора появляется точка с окраской, характеризующей определенные параметры обнаруженного объекта (танк, истребитель). Зная наши координаты, а также координаты объекта и дальность действия радара, легко определить координаты точки в масштабной сетке радара:{ цикл по всем динамическим объектам игры : } for i := 1 to CurrentObjectNum do
{ если i-й объект может быть обнаружен радаром : } if List[ i ].SightForRadar then
begin
X := Main.X - List[ i ].X;
Y := Main.Y - List[ i ].Y;
{ координата Z нужна для обнаружения летящих объектов : } Z := Main.Z - List[ i ].Z;
{ если расстояние от i-го объекта до самолета
меньше максимального действия радара : } if sqrt( X*X + Y*Y + Z*Z ) < Main.RadarDistance then { то отобразить на радаре i-й объект в точках,
пропорциональных размеру радара с учетом типа объекта
RadarType, характеризующего цвет отображения его на радаре} Main.ShowObjectOnRadar(
round(X * RADAR_SIZE / Main.RadarDistance),
round(Y * RADAR_SIZE / Main.RadarDistance),
List[ i ].RadarType );
Немного похожим является и алгоритм радиоэлектронной борьбы. При обнаружении в списке движущихся объектов ракеты или ее аналога (такое обнаружение может происходить опять-таки на конкретных расстояниях, примерно соответствующих реальным характеристикам прототипа, как правило, это та же дальность радара), у которой в качестве цели выступает наш самолет, производится расчет вероятности ликвидации этой ракеты. Величина этой вероятности определяется заранее, она должна быть подобрана достаточно аккуратно, чтобы в имитируемой обстановке частота выведения из строя вражеской ракеты была близка к реальной. Здесь необходимо учитывать время достижения ракетой цели, и соответственно корректировать величину вероятности. И с помощью датчика случайных чисел определяется сам факт поражения. - Состав, боекомплект, режимы работы, эффективность действия встроенного вооружения.
- Состав, способы применения, возможности по управлению, эффективность действия
подвесного вооружения.
Проблемы реализации вооружения в игре в основном ложатся не на программиста. Состав и боекомплект определяются сценаристом и консультантом, эффективность работы имитируется подобранными экспертами величинами вероятности настижения и степени разрушения поражаемого объекта. Специальными клавишами, как правило, выбирается текущая цель, номер которой в массиве игровых объектов запоминается в некоторой переменной. При этом цель выделяется на экране специальным значком - квадратиком или кружком, подчас как в реальных современных моделях суперистребителей, набитых электроникой, что достигается проверкой при просмотре списка объектов - сравнением его индекса с номером текущей цели:{ Отрисовка i-го объекта: }
{ ... нарисовать объект ... }
{ если i-й объект выделен в качестве цели : }
if i = TargetNumber then
{ нарисовать выделение объекта: }DrawOnScreenAsTarget( TargetNumber );
Самонаводящиеся ракеты после их запуска попадают в список динамических объектов и действуют уже автономно, в соответствии со своими параметрами и заданной мишенью, независимо от играющего. - Специальное оборудование и его функции.
К понятию специальное оборудование относятся, как правило, фантастические приспособления в космических имитаторах типа защитных силовых экранов, различных типов двигателей - химических, фотонных и т.п. Здесь все зависит только от фантазии сценариста и мастерства программиста. - Возможности управления и связи.
- Воздушная навигация.
Способы организации управления и процесса связи в большинстве авиаимитаторов достаточно похожи. С помощью клавиш-стрелок или джойстика самолет может закладывать виражи, космический корабль выделывать более сложные маневры с помощью своих дюз, а траектория его движения получается из используемой математической модели. Связь с базой имитируется обычно достаточно примитивно способом типа получения очередного задания в виде бегущей строчки на экране в момент выполнения очередного пункта боевой задачи или в начале игры. - Уровень летной подготовки и интеллекта (тактика действий) воздушного противника.
Эта тема относится к области искусственного интеллекта и вообще-то заслуживает отдельного разговора. Мы ограничимся здесь одной цитатой из напечатанного в PC-Review интервью с фирмой DIGITAL INTEGRATION. Ее программист Ник Маскаль в ответ на вопрос “Как работают перехватчики противника, которыми управляет компьютер? Они на самом деле выполняют какие-то маневры по заданной программе, или действуют сообразно с обстоятельствами?” ответил так: “Да, сообразно с обстоятельствами запускаются очень простые алгоритмы маневрирования типа “ножниц”. Хотя, конечно, реальные алгоритмы более изощренны”. - Имитация атмосферных явлений (облачность, туман, дымка, осадки и т.д.)
- Имитация времени года и суток.
Светлое и темное время суток, а также некоторые атмосферные явления можно имитировать подбором соответствующей цветовой палитры. Например, день - небо голубое, ночь - черное. В тумане помимо цветовой настройки-напыления молочного цвета меняется дальность видимости объектов. Если в солнечную погоду танки противника появляются на экране при приближении самолета к ним, условно, на пять километров, то в ночное время или в дымке это расстояние снижается до одного-двух километров. - Имитация местности.
- Имитация общей инфраструктуры на местности (населенные пункты, дороги, мосты и т.д.)
- Имитация водной поверхности.
Эти имитации в основном создаются сценаристами и гэйм-дизайнерами, как статические объекты в игре. Их реальность отображения зависит исключительно от качества используемых 3D-библиотек и мастерства художников. - Сложность и насыщенность системы ПВО противника.
- Соответствие характеристик средств вооружения и тактики действий ПВО.
- Поражающие возможности средств ПВО.
В начале этой главы мы приводили пример программирования атаки наземным устройством летящего истребителя. Моделирование работы ПВО происходит аналогично. Требуется лишь детальная и точная подгонка различных параметров, чтобы функционирование ПВО в игре более-менее соответствовало реальному сражению. - Возможность управления тактическими операциями (звено-эскадрилья).
- Возможность управления оперативно-тактическими операциями (полк-дивизия).
- Возможность управления стратегическими операциями.
Включение в игру возможностей влияния своими действиями (например, уничтожением командного пункта противника) на общий исход сражения выводит игру далеко за рамки простого симулятора военного самолета. Например, в игре “Секретное оружие Люфтваффе” имитатор совмещен с элементами стратегических или военных игр. Эту тему мы рассмотрим подробно в разделе WarGames. - Возможность реализации карьеры пилота и записи заданий.
По мере успешного выполнения героем боевых миссий он повышается в звании. Это отслеживается пропорционально степени сложности выполненного задания, когда за более ответственное задание вы можете получить более высокое звание. Сохранение текущего состояния игры осуществляется обычно в соответствии с именем игрока, вводимого в начале игры. В дальнейшем, когда вы снова запускаете программу и указываете свое имя, то программа ищет в списке сохраненных заданий запись с соответствующим именем и восстанавливает ранее отложенную игровую ситуацию. - Требования к ресурсам компьютера.
Имитаторы, как правило, не предъявляют слишком высоких требований к компьютеру. Для реализации быстрой графики обычно используется 256-цветный режим 320х200 точек, поддерживаемый даже MCGA. Желательно наличие сопроцессора для более быстрого вычисления трехмерных преобразований. Компактное (векторное) представление большинства игровых объектов позволяет использовать небольшие по размеру файлы данных. В последнее время прослеживается явная тенденция к усложнению игр этого класса, включаются элементы военной стратегии, увеличивается до сотен количество боевых миссий, повышается качество и детальность графики, поэтому можно спрогнозировать увеличение требований к компьютеру. Минимальной конфигурацией в ближайшие годы будет 386DX компьютер, 4 Мб оперативной памяти и более ста мегабайт на жестком диске (для хранения еще и других игр).
Оценка сложности программирования: 7 из 10.