netlib.narod.ru< Назад | Оглавление | Далее >

Главный список предметов

Каждый предмет в игре должен быть описан, и чтобы не запутаться в них, надо держать все описания в главном списке предметов (master item list, MIL). Думайте о MIL, как о каталоге товаров, подобном изображенному на рис. 11.2. У каждого объекта есть номер для ссылок, и хранится только одно описание предмета (даже если в игре таких предметов несколько).


Рис. 11.2. Подобно каталогу товаров, главный список предметов помогает держать объекты вашего мира в порядке

Рис. 11.2. Подобно каталогу товаров, главный список предметов помогает держать объекты вашего мира в порядке


В любое время, когда вам требуется новый объект, или вы хотите получить атрибуты какого-либо объекта, вы обращаетесь к MIL. На самом нижнем уровне MIL вашей игры может храниться как массив структур sItem или единый последовательный файл, состоящий из списка структур элементов (подобно тому, что показано на рис. 11.3). Как же создать свой собственный MIL? Давайте посмотрим.


Рис. 11.3. Последовательный файл MIL

Рис. 11.3. Последовательный файл MIL отслеживает каждый предмет в вашей игре. Размер данных каждого предмета фиксирован, что обеспечивает быстрый доступ к файлу в случае необходимости получить данные


Конструирование MIL

Приведенный ниже фрагмент кода создает небольшую структуру данных предмета, содержащую название предмета, его вес и размер. Это та же самая структура sItem, с которой начиналась эта глава, — мы просто повторно определили ее для хранения информации в главном списке предметов. Мы используем эту структуру для создания простого MIL:

typedef struct sItem
{
    char  Name[32]; // Название предмета
    float Weight;   // Вес (в кг.)
    float Size;     // Размер (в куб. дм.)
};

Теперь предположим, что вы хотите сохранить в MIL пять предметов, представив их в виде массива структур sItem:

sItem Items[5] = {
    { "Большой меч", 2.25f, 12.68f },
    { "Малый меч", 0.9f, 6.34f },
    { "Волшебная палочка", 0.22f, 3.17f },
    { "Камень", 0.45f, 1.57f },
    { "Эликсир", 0.22f, 1.57f }
};

Определив ваш собственный MIL (используя массив структур sItem), вы захотите сохранить список в файле для последующего использования. Этот случай имеет место, когда вы используете отдельную программу, создающую для вас MIL, такую, как вы увидите в следующем разделе «Использование редактора MIL». Сейчас взгляните на фрагмент кода, который создает файл (с названием items.mil) и сохраняет в него массив Items:

FILE *fp=fopen("items.mil", "wb");

for(short i = 0; i < 5; i++)
    fwrite(&Items[i], 1, sizeof(sItem), fp);

fclose(fp);

Хотя показанный пример создания файла MIL короткий и ясный, он абсолютно не годится для реальных приложений, в частности для ролевых игр. Описание предмета должно содержать больше информации, и вы, возможно, будете работать с тысячами предметов. Делать все это вручную в коде — напрасная трата времени. Вам нужен редактор предметов, который поможет в создании и управлении MIL — итак, встречайте MIL Editor.

Использование редактора MIL

Необходимость быстрого и простого создания предметов привела к появлению редактора главного списка предметов (редактора MIL). Во многом похожий на обсуждавшийся в главе 10, «Реализация скриптов», редактор MLS Editor, MIL Editor также состоит из единственного главного окна, позволяющего перемещаться по списку предметов и редактировать атрибуты каждого предмета. Вы можете сохранять и загружать MIL, но список атрибутов элементов останется фиксированным (пока вы не перепрограммируете редактор для соответствия вашим потребностям).

Полный исходный код редактора MIL Editor содержится на прилагаемом к книге CD-ROM (в каталоге \BookCode\Chap11\MILEdit). Когда вы запустите находящийся на CD-ROM редактор MIL Editor, появится диалоговое окно Master Item List Editor, показанное на рис. 11.4. В этом диалоговом окне есть окно со списком, содержащим все предметы, и кнопки для редактирования данных предмета и для сохранения и загрузки списков предметов. В списке предметов предусмотрено место для 1024 объектов, а это значит, что номер предмета можно хранить в 16-разрядной переменной (в диапазоне от 0 до 1023).


Рис. 11.4. Редактор главного списка предметов

Рис. 11.4. Редактор главного списка предметов используется для создания и редактирования данных игровых объектов. В показанном списке определено восемь предметов


Чтобы начать работу с редактором главного списка предметов найдите и запустите файл MILEdit.exe (он находится в папке \BookCode\Chap11\MILEdit). В диалоговом окне Master Item List Editor вы можете выполнять следующие действия для добавления или редактирования предметов и записи их списка на диск:

  1. Выберите предмет в списке Item List дважды щелкнув по нему (либо отметив предмет и щелкнув по кнопке Edit), или добавьте новый предмет, щелкнув по кнопке Add. На экран будет выведено диалоговое окно Modify Item (рис. 11.5).


    Рис. 11.5. Диалоговое окно Modify Item

    Рис. 11.5. Диалоговое окно Modify Item позволяет вам редактировать данные каждого объекта


  2. Отредактируйте требуемые поля в диалоговом окне Modify Item.

  3. Завершив редактирование щелкните OK, чтобы применить изменения и вернуться к диалоговому окну Master Item List Editor.

  4. Чтобы сохранить результаты работы, щелкните по кнопке Save в диалоговом окне Master Item List Editor, и в диалоговом окне Save MIL File введите имя файла и запишите MIL на диск.

 

ПРИМЕЧАНИЕ
Загрузка MIL также проста, как и запись; щелкните по кнопке Load в диалоговом окне Master Item List Editor. Затем в появившемся диалоговом окне Load MIL File выберите файл, который хотите загрузить.
Файлы MIL обычно используют расширение .MIL. Вы можете для своих списков использовать другое расширение, но примеры программ из этой книги используют .MIL.

Редактор MIL Editor использует ту же самую версию структуры sItem, что была показана ранее в этой главе, но я добавил дополнительные категории предметов. Эти дополнительные категории — Защита (Shield), Лечение (Healing) и Контейнер (Container, объекты, в которых можно переносить другие предметы, например, рюкзак). Эти дополнительные категории добавлены в список перечисления ItemCategories, показанный ранее в разделе «Категории предметов и значения»:

enum ItemCategories
{
    MONEY = 0, WEAPON,     ARMOR,
    SHIELD,    ACCESSORY,  EDIBLE,
    HEALING,   COLLECTION, TRANSPORTATION,
    CONTAINER, OTHER
};

Если вы решите модифицировать редактор MIL Editor для использования других атрибутов предметов или категорий, не забудьте соответствующим образом изменить структуру sItem. Теперь вы можете начать использовать созданные вами данные предметов в вашем игровом проекте.

Доступ к предметам из MIL

Если у вас есть MIL, можно загрузить весь список целиком в массив структур sItem, используя следующий код:

sItem Items[1024]; // Массив структур sItem

// Открываем файл Default.mil
FILE *fp = fopen("Default.mil", "rb");

// Читаем данные всех предметов
for(short i = 0; i < 1024; i++)
    fread(&Items[i], 1, sizeof(sItem), fp);

// Закрываем файл
fclose(fp);

Здесь я предполагаю, что ваша структура данных предмета относительно мала, и в вашем списке MIL не больше 1024 предметов. Что произойдет, если вы расширите структуру данных sItem или решите хранить в MIL больше предметов? Это приведет к значительному расходу памяти.

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

// ItemNum = номер загружаемого предмета
sItem Item;

// Открываем файл MIL с именем items.mil
FILE *fp=fopen("items.mil", "rb");

// Перемещаемся на соответствующую позицию в файле,
// основываясь на размере структуры sItem и номере
// загружаемого предмета
fseek(fp, sizeof(sItem) * ItemNum, SEEK_SET);

// Читаем структуру данных предмета
fread(&Item, 1, sizeof(sItem), fp);

// Закрываем файл
fclose(fp);

Вот он — быстрый и простой доступ к каждому предмету в MIL! Теперь пришло время что-нибудь сделать со всеми этими предметами.


netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz