Если вы еще не видели, я хочу показать вам один их тех загадочных .X файлов, поставляемый с DirectX SDK (расположенный в установочной директории DirectX \Samples\Multimedia\Media). Смелее, я вам разрешаю. Более чем вероятно, вы увидите что то вроде этого:
xof 0302txt 0032
template Header {
<3D82AB4 3-62DA-11cf-AB3 9-002 0AF71E43 3> DWORD major; DWORD minor; DWORD flags;
template Frame {
<3D82AB4 6-62DA-11cf-AB3 9-0 02 0AF71E4 3 3> [FrameTransformMatrix] [Mesh]
Header { 1; 0; 1;
Frame Scene_Root {
FrameTransformMatrix {
1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;
}
Frame Pyramid_Frame { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;
}
Mesh PyramidMesh { 5;
0.00000,-10.00000,-0.00000;, -10.00000,-0.00000,-10.00000;, 10.00000,-0.00000,-10.00000;, -10.00000 ,-0.00000,--10.00000 ;, 10.00000; 0.00000;-10.00000;; 6;
3;0,1,2;, 3; 0, 2, 3;, 3;0,3,4;,
3;2,4,3;;
MeshMaterialList
1;
6;
0,0,0,0,0,0;;
Material MaterialO {
1.000000; 1.000000; 1.000000; 1.000000;; 0.000000;
0.050000; 0.050000; 0.050000;; 0.000000; 0.000000; 0.000000;;
}
}
}
}
}
Выглядит пугающе, не правда ли? На самом деле вы можете разбить каждый .X файл на маленькие, привлекательные, легкоуправляемые компоненты, которые делают файл простым для понимая и обработки. Давайте я объясню, что я имею ввиду. Каждый .X файл начинается с небольшого заголовка, который, для предыдущего примера, выглядит так:
xof 0302txt 0032
Это маленькое текстовое пояснение сообщает программе, что загружаемый файл действительно является .X файлом. ( Кусочек "xof " обозначает .X файл). Он также информирует программу, что файл использует шаблоны DirectX .X версии 3.2 (представленные как "0302"). После версии следует "txt", это означает, что все далее следующие данные представлены в текстовом формате, в отличие от двоичного. Строка заканчивается числом "0032", которое определяет число бит, используемых вещественными числами ("0032" для 32-битных или "0064" для 64-битных).
После заголовка файла идет последовательность наборов данных, называемых шаблонами и объектами данных. Возможность отличать шаблоны от объектов данных реализуется с помощью использования перед шаблонами слова "template". Как вы можете видеть из кода файла .X, шаблон очень похож на определение структуры языка С. Объекты данных являются экземплярами шаблонов.
Вы можете использовать шаблоны для определения информации, хранимой объектом данных в .X файле. (Шаблон определяет расположение объекта данных). Каждый шаблон может содержать любой тип данных, определенный небольшим набором типов данных, и любая комбинация типов данных может быть использована внутри шаблона. Объект данных является просто экземпляром шаблона. Вы можете думать о шаблоне в большей степени как о классе C+ + , они оба определяют данные, которые может содержать экземпляр объекта.
Замечание. Второй формат хранения ^файлов - двоичный, полезен для представления данных в нечитаемом для человека виде. Я не буду обсуждать этот формат в книге; в любом случае, методы, применяемые для обработки Xфайлов, используемые в этой главе, употребляются и для двоичныхXфайлов, так что вы не пропустите ничего полезного!
Посмотрев еще раз на пример .X файла, вы можете видеть, что первым встреченным шаблоном является "Header", который является названием класса шаблона. Шаблон "Header" содержит три значения DWORD (наряду с большим числом, называемым GUID, которое заключено в угольные кавычки), которые вы задаете при создании объекта из шаблона. Создание объекта во многом похоже на создание класса или структуры. В ранее упомянутом примере .X файла описание шаблона "Header" выглядит так:
Header {
1; // старший 0; // младший 1; // флаги
}
Заметьте, что вы должны определять все переменные, содержащиеся в шаблоне "Header" в вашем объекте данных, причем в таком же порядке. Вас, возможно, заинтересовало большое число (шаблонный GUID), определенное в шаблоне. Как оно связано с заданием шаблона? На самом деле никак, потому что DirectX использует это большое число для идентификации шаблона, при его загрузке. Я вернусь к шаблонному GUID (Глобально Уникальное Идентификационное Число) через мгновение.
Совет. Совсем как в C/C++ вы можете использовать оператор для обозначения комментариев в Ж/файлах.
Следующий шаблон, который вы увидите в .X файле, - "Frame". Это специальный шаблон, он не определяет никакого типа данных, зато ссылается на другие классы шаблонов. Другие классы шаблонов, заключенные в квадратные скобки, называются "FrameTransformMatrix" и "Mesh". Используя ссылки на другие шаблоны, вы можете создавать иерархии объектов.
Также объявляя дополнительные шаблоны внутри другого шаблона, вы создаете набор шаблонных ограничений, которые позволяют вам создавать шаблоны, которые, в свою очередь, позволяют вставку заданных объектов в другой объект. В данном случае только объекты типов "FrameTransformMatrix" и "Mesh" могут быть встроенны в объект "Frame". Более подробно о шаблонных ограничениях вы прочитаете далее в этой главе. А сейчас давайте перейдем к рассмотрению оставшейся части .X файла.
После объявления шаблонов (которое должно быть в начале .X файла), следуют объекты данных. Они объявляются совсем как структуры С - вы задаете структуру именем шаблона класса и следующим после него названием экземпляра объекта данных. Имя экземпляра является необязательным, так что не волнуйтесь, когда не найдете имени у некоторых объектов.
В рассматриваемом файле .X первый объект данных имеет имя "Scene_Root". Объект "Scene_Root " принадлежит шаблону класса "Frame". Вы уже видели определение шаблона "Frame". Вернувшись к определению того шаблона, вы можете увидеть, что он не хранит никаких данных, но имеет два необязательных встроенных объекта данных - "FrameTransformMatrix " и " Mesh".
По счастливому стечению обстоятельств оба объекта "FrameTransformMatrix " и "Mesh" встроенны в "Scene_Root". Однако в .X файле отсутствует определение шаблонов для "FrameTransformMatrix " и "Mesh". Как вы сможете узнать, какие данные содержат эти объекты? Оказывается, что не обязательно все определения шаблонов должны содержаться в .X файле, вы можете определить эти шаблоны в вашей программе!
Вы научитесь определять шаблоны внутри вашей программы далее в этой главе. А теперь вернемся к примеру. Объект данных шаблонного класса "FrameTransformMatrix " встроен в объект "Scene_Root". Он содержит вещественные числа, которые представляют собой матрицу преобразования. Далее следует объект шаблонного класса "Mesh", который содержит информацию о меше.
Достаточно об этом примере, я уверен, что вы поняли суть. Как вы можете видеть, шаблоны полностью определяются пользователем, что означает, что вы можете создавать любые типы шаблонов, содержащие любые данные. Хотите хранить звук в .X файлах? А как насчет хранения в них кардиограммы? Используя .X файлы вы можете хранить звук, кардиограммы, любые типы данных, какие вы только захотите!
⇐Использование формата файла .X || Оглавление || Определение шаблонов⇒