Главная » Документация » Алгоритмы, применяемые в играх

RSS

Алгоритмы, применяемые в играх

Аркадные игры

Практически обязательными персонажами игр данного стиля являются монстры-противники. Внутри программы к ним прибавляется также группа пуль (см.ниже) и стен-платформ. Общей их характеристикой является то, что все эти объекты движутся. Их неудобно представлять значениями игрового массива, так как при этом будет тратиться слишком много сил на их поиск в каждый момент времени. Для эффективного решения этой задачи используются вспомогательные списки из объектов «движущийся элемент». Это могут быть списки указателей на соответствующие структуры, конкретная техника реализации не принципиальна.

В каждом объекте «движущийся элемент» должно быть поле, конкретизирующее тип данного объекта, – платформа, монстр и т.п., его координаты, скорость движения или частота стрельбы, траектория движения и дополнительная информация. Для платформ это может быть диапазон перемещения, для самострелов – дальность и направление выстрела, для роботов – способ реакции на героя (например, нападать только тогда, когда герой вступил в некоторую зону и отставать при выходе из нее), и степень «понимания» обстановки, то есть вероятность правильного выбора направления передвижения. Например, для злых чудовищ, блуждающих по лабиринту в поисках героя, в зависимости от уровня можно задавать различные значения этой величины. Тогда на первом уровне чудовища будут блуждать абсолютно хаотично, на втором – с вероятностью, допустим, 0.2 каждый шаг будет не случайным, а делаться в направлении героя и так далее.

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

Вот небольшой пример проверки съедания героя монстрами:

1
2
3
4
5
6
7
for i:= 0 to Length(MonsterList.Count-1 do
  if (MonsterList[i].Type = KILLER) and // проверка типа монстра
     (MonsterList[i].Pos.X = Hero.Pos.X) and // проверка совпадения координат
     (MonsterList[i].Pos.Y == Hero.Pos.Y) then
     begin
     { Герой погиб }
     end;

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

Типичная аркада

Ключевым является главный объект «ГЕРОЙ». Помимо координат его местонахождения он содержит ряд дополнительных характеристик. Это в первую очередь запас энергии или количество жизней, наличие и тип вооружения, запас боеприпасов, а также найденные предметы и очки. Герой передвигается с помощью стрелок или джойстика. Процесс реализации перемещения очевиден. К текущим координатам героя прибавляется соответствующее смещение и для новых координат производятся разнообразные проверки на предмет наличия помех (стен), проваливания в ямы, нахождения различных предметов и т.д. Если передвижение по выбранному направлению невозможно, то восстанавливаются старые координаты.

Достаточно сложным является процесс реализации стрельбы как героя, так и его противников. Для объектов, управляемых программой, прежде всего необходимо подбирать соответствующие значения периодичности стрельбы и точности выстрела. В играх, где после момента выстрела не существует паузы до момента поражения героя (то есть герой не может уворачиваться от выстрелов), дальнейший процесс обработки выстрела несложен. Без проверки всех событий игры рисуется траектория выстрела, проверяется поражение цели, и она либо поражается (вычеркивается из игры или понижается ее энергия), либо выстрел прошел мимо. После этого изображение на экране восстанавливается, и продолжается обычный ход событий. Если же герой может уворачиваться от летящих в него пуль и прочих предметов, то задача усложняется. После выстрела создается динамический объект пули, включаемый в список динамических объектов. Он характеризуется скоростью, направлением движения и типом (копье, лазерный луч и т.д.) Тип нужен для корректного определения размера поражения цели.

Сам алгоритм platforms & ladders-игр похож на алгоритмы из многих других типов игр. Попробуем его описать.

  1. Проинициализировать все начальные значения в игре, создать текущий уровень
    лабиринта.
  2. Опросить клавиатуру или джойстик. Если человек ничего не делает, то перейти
    к п.5.
  3. Если передвижение героя, то
    • вычислить новые координаты;
    • если передвижение вперед возможно, то передвинуть героя, проверить достижение
      цели и наличие в новой точке других объектов (ключ, платформа, монстр и т.д.)
      При наличии сделать необходимые действия.
    • иначе восстановить старые координаты;
    • Если герой выстрелил, то добавить объект «пуля» в список динамических объектов.
  4. Просканировать список динамических объектов. Для тех, у кого подошла периодичность
    действия:

    Для объектов типа платформа: вычислить новые координаты, переместиться;

    Для объектов типа монстр : вычислить новые координаты, переместиться, проверить
    наличие жертвы в новой точке, при необходимости совершить нужное действие;
    Для объектов типа пуля : переместиться в новую точку. Если она не пуста, то:

    • если в ней поражаемая цель, то изменить характеристики цели (понизить запас
      энергии, вычеркнуть из списка объектов); вычеркнуть себя из списка динамических
      объектов.
  5. Перейти к п.2.

Конечно, современные platforms & ladders-игры во многом сложнее приведенного нами алгоритма. Они представляют собой, как правило, сложное сочетание лабиринтной идеологии с крутыми аркадными вставками, менеджментом, но основа их остается неизменной. Многие разновидности и новые версии известных игр являются, по сути, старыми играми с новыми картинками спрайтов и измененным количеством персонажей с различными характеристиками. Сложность этого типа игр сегодня заключается практически только в оптимальном подборе параметров, придумыванию хорошего сюжета и качественного дизайна.

Аркадные гонки

Сегодня появляются новые игры этого жанра, например, DOOM. Качественным их отличием от себе подобных является увеличение числа измерений до трех. Правда, это не сильно меняет структуру программы. Хотя герой теперь имеет возможность перемещаться не дискретно – по квадратам, а непрерывно, то есть как и в реальной жизни, перемещаться в любую доступную точку помещения, но по сути ничего не меняется. Конечно, исчезает базовый массив, описывающий структуру лабиринта, а задача проверки столкновения героя со стенами ложится на программу, но принцип остается схожим. Теперь программа содержит только описания координат стен и их толщин и проверяет допустимость координат героя:

1
2
if (Hero.OldPos.X < Wall[i].X) and (Hero.NewPos.X > Wall[i].X) then
 { попытка пересечь стену ! }

Соответственно появляется по аналогии с списком динамических объектов и список статических объектов (PowerUp List). При этом на каждом шаге героя проверяется его близость к тому или иному предмету и при необходимости совершается соответствующее действие. Некоторые предметы надо специально брать, для чего служит специальная клавиша. Но в целом структура базового алгоритма не меняется. Введение третьего измерения по сути аналогично новым уровням игры, когда подъем наверх имитирует переход на другой уровень или вход в другой лабиринт в обычных играх этого типа. На самом деле создатели игр типа DOOM исповедуют оба подхода. Например, в игре Terminator:Rampage фирмы Bethesda Softworks с 3-Д графикой, практически идентичной Id Software, положение героя тоже дискретно, а расположение комнат и коридоров на каждом из уровней заложены в массив 100х100 элементов. Но на внешнем виде игры этот нюанс никак не сказывается.

Страницы : 1 2 3 4 5 6 7