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

         

Функция 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.


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

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

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

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

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



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