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

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

119

//Получить имя фрейма (назначить новое, если не было найдено) if((Frame->Name = GetObjectName(pDataObj)) == NULL)

Frame->Name = strdup("No Name") ;

//связать структуру фрейма в список

if(Data == NULL) {

// связать как родственник корневого Frame->pFrameSibling = m_RootFrame; m_RootFrame = Frame;

Data = (void**)&m_RootFrame;

}else {

//связать как потомка текущего фрейма D3DXFRAME_EX *FramePtr = (D3DXFAME_EX*)*Data; Frame->pFrameSibling = FramePtr->pFrameFirstChild; FramePtr->pFrameFirstChild = Frame;

Data = (void**)&Frame;

}

}

return ParseChildObjects(pDataObj,Depth,Data,Reference);

};

cXFrameParser Parser; Parser.Parse("frames.x");

// Parser.m_RootFrame теперь указывает на корневой фрейм иерархии

Вот и все. После завершения функции cXFrameParser::Parse у вас будет хранящаяся самостоятельно иерархия фреймов, готовая к использованию в ваших проектах. Чтобы лучше понять, как использовать этот класс, посмотрите демонстрационную программу ParseFrame компакт-диска книги (смотрите конец главы для дополнительной информации). Демонстрационная программа ParseFrame загружает выбранный вами.Х файл и отображает иерархию объектов

вокне списка.

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

Загрузка анимации из .X

Хотя такое базовое понятие как анимация заслуживает своего рассмотрения, я отложу обсуждение загрузки данных анимации до глав по работе с заранее вычисленной анимацией, потому что это больше соответствует порядку книги. Данные анимации могут быть в любом формате (как и все данные), но в оставшихся главах книги вы поймете, как создать свой набор шаблонов анимации для использования в проектах. Не волнуйтесь, все получиться, просто не сдавайтесь!

120 .

Глава 3

Загрузка специализированных данных из .X

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

Вернемся к шаблону ContactEntry и посмотрим, как анализировать .X файл и отобразить все экземпляры ContactEntry. Как и раньше небольшой, унаследованный от cXParser, нам отлично подойдет.

// Сначала объявим GUID ContactEntry #include "initguid.h" DEFINE_GUID(ContactEntry, \

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

// Now, define the .X parser class class cXContactParser : public cXParser

public:

BOOL ParseObject(IDirectXFileData *pDataObj, \ IDirectXFileData *pParentDataObj, \ DWORD Depth, \

void **Data, BOOL Reference)

//пропустить ссылочные объекты if(Reference == TRUE)

return TRUE;

//убедиться, что анализируемый объект - ContactEntry if(*GetObjectGUID(pDataObj) == CONTACTENTRY) {

//Получить указатель на данные и их размер

DWORD DataSize;

DWORD *DataPtr;

DataPtr = (DWORD*)GetObjectData(pDataObj, &DataSize);

//Получить имя из объекта данных char *Name = (char*)*DataPtr++;

//Получить номер телефона из объекта данных char *PhoneNum = (char*)*DataPtr++;

//Получить возраст из объекта данных

DWORD Age = *DataPtr++;

// Отобразить контактную информацию char Text[1024];

sprintf(Text, "Name: %s\r\nPhone #: %s\r\nAge: %lu", \ Name, PhoneNum, Age);

MessageBox(NULL, Text, "Contact", MB_OK);

return ParseChildObjects(pDataObj,Depth,Data,Reference);

}

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