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

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


Функция vNewFrame() используется для создания ключевого кадра для каждого объекта сцены. Если создается первый кадр анимации, ему присваиваются ключевые значения по умолчанию. Если кадр не первый, то значения ключей копируются из предыдущего кадра. Благодаря этому упрощается создание анимации, поскольку не надо каждый раз при создании нового кадра заново позиционировать, вращать и масштабировать объект. Вот как выглядит код функции:

void C3DAnimation::vNewFrame(void) { int iFrame = 0; stKeyFrame *ptrFrame; stKeyFrame *ptrPrevFrame;

// Увеличение количества кадров в анимации m_iNumFrames++; // Получение индекса ключевого кадра iFrame = m_iNumFrames - 1; // Создаем новый кадр для каждого объекта // в анимации. for(int iObj = 0; iObj < m_iNumObjects; iObj++) { // Выделяем память для кадра m_keyFrames[iObj][iFrame] = new stKeyFrame; // Получаем указатель на новый кадр ptrFrame = m_keyFrames[iObj][iFrame]; // Присваиваем первому кадру значения по умолчанию if(iFrame == 0) { ptrFrame->m_vecScale = D3DXVECTOR3(1.0, 1.0, 1.0); ptrFrame->m_vecRot = D3DXVECTOR3(0.0, 0.0, 0.0); ptrFrame->m_vecTrans = D3DXVECTOR3(0.0, 0.0, 0.0); ptrFrame->m_lTimeDelay = 10; } // Остальным кадрам присваиваем значения, // скопированные из предыдущего кадра else { // Получаем указатель на предыдущий кадр ptrPrevFrame = m_keyFrames[iObj][(iFrame - 1)];

// Копируем данные из предыдущего кадра в текущий ptrFrame->m_vecScale = ptrPrevFrame->m_vecScale; ptrFrame->m_vecRot = ptrPrevFrame->m_vecRot; ptrFrame->m_vecTrans = ptrPrevFrame->m_vecTrans; ptrFrame->m_lTimeDelay = ptrPrevFrame->m_lTimeDelay; } } m_iCurFrame = iFrame; }

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

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

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

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



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