Программирование стратегических игр с DirectX 9.0

bda5893f

Функция C3DAnimation::vSave()


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

void C3DAnimation::vSave(char *szFileName) { FILE *fp; int i, j; char szFullFileName[512];

// Создаем квалифицированное имя файла sprintf(szFullFileName, "Data\\Anims\\%s.anim", szFileName); // Открываем файл для записи fp = fopen(szFullFileName, "wb"); if(fp == NULL) { return; } // Вывод заголовка // Количество объектов fwrite(&m_iNumObjects, 1, sizeof(int), fp); // Количество кадров fwrite(&m_iNumFrames, 1, sizeof(int), fp); // Вывод имен объектов for(i = 0; i < m_iNumObjects; i++) { fwrite(&m_szObjectName[i][0], 32, sizeof(char), fp); } // Вывод информации о ключевых кадрах for(i = 0; i < m_iNumObjects; i++) { for(j = 0; j < m_iNumFrames; j++) { // Задержка fwrite(&m_keyFrames[i][j]->m_lTimeDelay, 1, sizeof(long), fp); // Поворот fwrite(&m_keyFrames[i][j]->m_vecRot, 1, sizeof(D3DXVECTOR3), fp); // Масштаб fwrite(&m_keyFrames[i][j]->m_vecScale, 1, sizeof(D3DXVECTOR3), fp); // Местоположение fwrite(&m_keyFrames[i][j]->m_vecTrans, 1, sizeof(D3DXVECTOR3), fp); } } // Закрываем файл анимации fclose(fp); // Сохраняем имя анимации strcpy(m_szAnimName, szFileName); }

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


Функция C3DAnimation::vSave()

Рис. 11.22. Структура формата файла анимации

На рис. 11.22 видно, что файл анимации состоит из заголовка, за которым следуют имена объектов, а далее располагается информация о ключевых кадрах.

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

Далее следует информация о кадрах. Код в цикле перебирает все кадры анимации и выводит информацию о задержке, вращении, масштабировании и местоположении каждого присутствующего в кадре объекта. Цикл продолжается до тех пор, пока не будет выведена информация обо всех кадрах.

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



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