Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DirectX. Продвинутая Анимация (2004) [rus].pdf
Скачиваний:
335
Добавлен:
16.08.2013
Размер:
8.39 Mб
Скачать

86

Глава 3

В рассматриваемом файле .X первый объект данных имеет имя "Scene_Root". Объект "Scene_Root " принадлежит шаблону класса "Frame". Вы уже видели определение шаблона "Frame". Вернувшись к определению того шаблона, вы можете увидеть, что он не хранит никаких данных, но имеет два необязательных встроенных объекта данных - "FrameTransformMatrix " и " Mesh".

По счастливому стечению обстоятельств оба объекта "FrameTransformMatrix " и "Mesh" встроенны в "Scene_Root". Однако в .X файле отсутствует определение шаблонов для "FrameTransformMatrix " и "Mesh". Как вы сможете узнать, какие данные содержат эти объекты? Оказывается, что не обязательно все определения шаблонов должны содержаться в .X файле, вы можете определить эти шаблоны в вашей программе!

Вы научитесь определять шаблоны внутри вашей программы далее в этой главе. А теперь вернемся к примеру. Объект данных шаблонного класса "FrameTransformMatrix " встроен в объект "Scene_Root". Он содержит вещественные числа, которые представляют собой матрицу преобразования. Далее следует объект шаблонного класса "Mesh", который содержит информацию о меше.

Достаточно об этом примере, я уверен, что вы поняли суть. Как вы можете видеть, шаблоны полностью определяются пользователем, что означает, что вы можете создавать любые типы шаблонов, содержащие любые данные. Хотите хранить звук в .X файлах? А как насчет хранения в них кардиограммы? Используя .X файлы вы можете хранить звук, кардиограммы, любые типы данных, какие вы только захотите!

Определение шаблонов

Т. к. дизайн .X файлов является открытым, вы должны предопределять каждый используемый с DirectX шаблон, чтобы понять, как получить доступ к данным шаблона. Обычно шаблоны определяются внутри .X файла, хотя вы можете определять их и в вашей программе (как я замечал ранее).

Вы определяете шаблон (содержащийся в .X файле), назначая ему уникальное имя, следующее после слова "template", как я сделал в далее. (Обратите внимание на открывающуюся скобку, обозначающую начало определения шаблона.)

template ContactEntry {

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

Использование формата файла .X

87

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

Для определения GUID для вашего шаблона запустите программу "guidgen.exe", поставляемую вместе с компилятором "Microsoft Visual C/C++" (находящуюся в инсталяционной директории \Common\Tools вашего MSVC). После нахождения и запуска программы "guidgen.exe" перед вами появится небольшое диалоговое окно, показанное на рис. 3.1.

Рис. 3.1. Диалоговое окно "Create GUID" ("Создать GUID") программы "guidgen.exe" позволяет вамсоздаватьуникальныеидентификационныечиславразличныхформатах

Как вы можете видеть на рис. 3.1, диалоговое окно "Create GUID" позволяет вам выбрать формат создаваемого GUID. В данном случае вы должны использовать формат №2 DEFINE_GUID(...). Выберите данную опцию и нажмите кнопку "Cору" ("Копировать").

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

.X файлу и вставьте содержимое буфера обмена в ваше объявление шаблона.

template ContactEntry {

// {4C9D055B-C64D-4bfe-A7D9-981F507E4 5FF} DEFINE_GUID («name»,

0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \ 0x1f, 0x50, 0x7e, 0x45, 0xff);

88

Ой! Здесь немного больше текста, чем необходимо для шаблона, поэтому вырежем макрос DEFINE_GUID и вставим его в исходный код проекта. Да, все правильно - каждый определенный вами шаблон требует соответствующего определения GUID (например, используя макрос DEFINE_GUID) в вашем коде. Это означает, что вам необходимо подключить заголовочный файл "initguid.h" в ваш код и использовать DEFINE_GUID, как я сделал тут.

#include "initguid.h"

// В начале файла исходного кода добавьте DEFINE_GUIDs DEFINE_GUID(ContactEntry, \

0x4c9d055b, 0xc64d, 0x4bfe, 0xa7, 0xd9, 0x98, \ 0x1f, 0x50, 0x7e, 0x45, 0xff);

Заметьте, что в макросе DEFINE_GUID я заменил " « n a m e » " на фактическое название класса шаблона, который я определяю. В данном случае я использую "ContactEntry " в качестве названия макроса. После этого макрос "ContactName" будет содержать указатель на GUID моего шаблона (который должен совпадать с GUID шаблона, используемого в .X файле).

Возвращаясь к шаблону "ContactEntry ", вам также необходимо удалить тег комментария из вставленного текста и изменить кавычки GUID на угловые, как я сделал тут:

template ContactEntry { <4C9D055B-C64D-4bfe-A7D9-981F507E45FF>

Теперь вы готовы продолжить и определить данные шаблоны. Шаблоны очень похожи на классы и структуры С; они содержат переменные и указатели на другие шаблоны, наряду с ограничениями доступа. Типы используемых данных практически полностью совпадают с используемыми в С. В таблице 3.1 показаны типы данных, которые вы можете использовать для определения шаблонов, и их аналоги в C/C++.

Таблица 3.1. Типы данных шаблонов .X

Тип данных

Описание

 

 

WORD

16-битное число (short)

 

 

DWORD

32-битное число (32-битное int или long)

 

 

FLOAT

вещественное число IEEE (float)

 

 

DOUBLE

64-битное вещественное число (double)

CHAR

8-битное знаковое число (signed char)

Использованиеформатафайла.X

Таблица3 . 1 .Типы д а н н ы х шаблонов .X (Продолжение)

Типданных

 

Описание

 

 

 

UCHAR

8-битное беззнаковое число

(unsigned char)

 

 

 

BYTE

8-битное беззнаковое число

(unsigned char)

 

 

STRING

строка, оканчивающаяся нулем (char[ ])

 

 

Array

Массив определенного типа данных ([ ])

 

 

 

Совсем как в объявлении переменной C/C++ , вы указываете ключевое слово типа данных и имя экземпляра, заканчивая точкой с запятой (означает окончание объявления переменной)

DWORD Value;

В таблице 3.1 вы могли заметить ключевое слово "array", которое определяет массив элементов типа данных. Для определения массива вы задаете ключевое слово "array", тип данных, имя экземпляра и размер массива (заключенный в квадратные скобки). Например, для объявления массива из 20 элементов типа "STRING" вы можете использовать

array STRING Text[20];

Замечание. Замечательным свойством массивов является возможность использования другого типа данных для определения размера массива, как я сделал тут:

DWORD ArraySize;

array STRING Names[ArraySize];

Теперь вернемся к шаблону "ContactEntry" и определим имя человека, телефон и возраст. Эти три переменные - две строки (имя и номер телефона) и одно численное значение (возраст) - могут быть определены в шаблоне "ContactEntry" как показано здесь.

template ContactEntry { <4C9D055B-C64D-4bfe-A7D9-981F507E45FF> STRING Name; // имя

STRING PhoneNumber; // телефон DWORD Age; // возраст

}

Замечательно! Чтобы закончить объявление шаблона, добавьте закрывающуюся скобку, и он готов к использованию.

Соседние файлы в предмете Программирование на C++