Функция C3DAnimation::vLoad()
Функция загрузки читает ранее сохраненные функцией записи данные. Звучит просто, не так ли? А вот и код функции:
void C3DAnimation::vLoad(char *szFileName) { FILE *fp; int i, j; int iNumObjs; int iNumFrames; char szFullFileName[512];
// Создание квалифицированного имени файла sprintf(szFullFileName, "Data\\Anims\\%s.anim", szFileName); // Открытие файла для чтения fp = fopen(szFullFileName, "rb"); if(fp == NULL) { return; } // Сброс объектов в состояние по умолчанию vReset(); // Чтение заголовка // Количество объектов fread(&iNumObjs, 1, sizeof(int), fp); // Количество кадров fread(&iNumFrames, 1, sizeof(int), fp); // Загрузка информации об объектах for(i = 0; i < iNumObjs; i++) { // Чтение имени объекта fread(&m_szObjectName[i][0], 32, sizeof(char), fp); // Загрузка данных объекта iNewObj(&m_szObjectName[i][0]); } // Выделение памяти для кадров for(i = 0; i < iNumFrames; i++) { vNewFrame(); } // Чтение информации о ключевом кадре for(i = 0; i < m_iNumObjects; i++) { for(j = 0; j < m_iNumFrames; j++) { // Задержка fread(&m_keyFrames[i][j]->m_lTimeDelay, 1, sizeof(long), fp); // Вращение fread(&m_keyFrames[i][j]->m_vecRot, 1, sizeof(D3DXVECTOR3), fp); // Масштаб fread(&m_keyFrames[i][j]->m_vecScale, 1, sizeof(D3DXVECTOR3), fp); // Местоположение fread(&m_keyFrames[i][j]->m_vecTrans, 1, sizeof(D3DXVECTOR3), fp); } } // Закрываем файл анимации fclose(fp); // Сохраняем имя анимации strcpy(m_szAnimName, szFileName); }
Ход выполнения функции загрузки показан на рис. 11.23.
Рис. 11.23. Ход выполнения функции загрузки
На рисунке, как и в коде видно, как функция читает данные анимации. В первых строках кода создается полностью квалифицированное имя файла, и затем открывается указанный файл. Потом код выполняет инициализацию анимации, если она содержит какие-то данные, и загружает данные заголовка.
После загрузки данных заголовка функция в цикле считывает указанное количество имен трехмерных объектов. Прочитав очередное имя, код загружает модель трехмерного объекта. Это продолжается, пока не будут загружены все объекты.
После того, как загружены данные трехмерных моделей, функция выделяет память для каждого содержащегося в файле кадра. Когда требуемая память выделена, считываются сами данные кадров.
И в самом конце код закрывает файл и сохраняет имя анимации в данных класса анимации. Вот и все!