Программирование игр для Windows. Советы профессионала

Структуры данных в компьютерных играх


Теперь я хотел бы обсудить, какие структуры данных для представления объектов используются в компьютерных играх. Объектами игры может быть оружие, фантастические создания, различные предметы, которые нужно искать ц т. д. Создавая объект для игры, вы должны продумать, какими свойствами он должен обладать и отразить это в структуре данных.

Для примера рассмотрим, что требуется иметь для статического объекта. Под статическими я понимаю объекты, которые игрок может подобрать по ходу игры (в то время как динамическими я буду называть те объекты, которые могут перемещаться самостоятельно). Статический объект не совершает никаких действий, он просто лежит в определенном месте игрового пространства. Когда ваш герой находит такой объект, он поправляет свое здоровье, подкрепляет упавшие силы, пополняет арсенал и т. д. Листинг 11.1 содержит возможную структуру данных такого объекта.

Листинг 11.1. Структура данных статического объекта.

typedef struct static typ

{

int x,y; //позиция объекта

int type; // тип объекта: еда, энергия или здоровье

char *data; // указатель на растровое изображение объекта

int state; // состояние объекта

int amount; // поле для уточнения типа объекта

} static, *static ptr;

Для начала вполне можно использовать Листинг 11.1, а потом дополнять его необходимыми полями. Мы могли бы создать связанный список с использо­ванием указателей, однако если объектов в игре немного, то лучше использовать массив, описав его следующим образом:

static stuff



[10]

Осталось инициализировать массив stuff, а затем, работая со статическими объектами, ссылаться на него.

Другой пример. Давайте рассмотрим, чем обладает в игре сам игрок. В нашей демонстрационной игре Warlock игрок - это волшебник, он имеет заклинания, здоровье, несколько жизней, а также может собирать различные предметы. Кроме этого, нам понадобятся различные растровые изображения его рук, видимых на переднем плане экрана. Листинг 11.2 показывает первое приближение обходимой структуры данных.

Листинг 11.2.


Структура данных игрока.


typedef struct player_typ

{

int x,y;                // Позиция игрока

int lifes;              // Количество оставшихся жизней

int health;             // Уровень здоровья

int weapons[3];        // Массив, содержащий типы оружия, которые

// есть у игрока

int spells [10] ;       // Массив, содержащий заклинания, которые

// имеются у игрока

char *hands_stationary; // Растровое изображение рук игрока, когда

// он ничего не делает

char *hand_motion[4];   // Четыре растровых изображения рук игрока

// для выполнения заклинаний

int state;              // Состояние игрока: жив, мертв, умирает

} player, *player_ptr;

(Мы коротко расскажем о состояниях объектов чуть позже в этой главе, а более подробно —в тринадцатой главе, "Искусственный интеллект").

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

Если в вашей игре есть как статические, так и динамические объекты, вы должны написать код, который будет рисовать, передвигать, отрабатывать столкновения и уничтожать объекты. Однако вам наверняка не захочется писать новые функции для каждого отдельного дерева! Давайте посмотрим, как можно клонировать игровые объекты.


Содержание раздела