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

Функция vRender()


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

// Очистка вторичного буфера синим цветом g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_RGBA(200, 250, 255, 255), 1.0f, 0); // Начало сцены g_pd3dDevice->BeginScene(); // Установка материала по умолчанию g_pd3dDevice->SetMaterial(&g_mtrlDefault); // Установка режима сплошной заливки g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); // Визуализация пола vDraw3DObject(D3DXVECTOR3( 0.0, 0.0, 0.0) , D3DXVECTOR3(200.0, 200.0, 200.0), D3DXVECTOR3( 90.0, 0.0, 0.0), 0); // Визуализация трехмерных объектов if(animTest.m_iNumFrames && animTest.m_iNumObjects) { for(int i = 0; i < animTest.m_iNumObjects; i++) { // Объекты не являющиеся текущими отображаем в каркасном режиме if(i != g_iCurObj) { g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_WIREFRAME); } // Текущий объект отображаем в режиме сплошной заливки else { g_pd3dDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); } // Установка текущего кадра iCFrame = animTest.m_iCurFrame; // Визуализируем объекты, используя информацию кадра // хранящуюся в объекте анимации animTest.m_objObject[i]->vDisplayXYZ( animTest.m_keyFrames[i][iCFrame]->m_vecTrans.x, animTest.m_keyFrames[i][iCFrame]->m_vecTrans.y, animTest.m_keyFrames[i][iCFrame]->m_vecTrans.z, animTest.m_keyFrames[i][iCFrame]->m_vecRot.x, animTest.m_keyFrames[i][iCFrame]->m_vecRot.y, animTest.m_keyFrames[i][iCFrame]->m_vecRot.z, animTest.m_keyFrames[i][iCFrame]->m_vecScale.x, animTest.m_keyFrames[i][iCFrame]->m_vecScale.y, animTest.m_keyFrames[i][iCFrame]->m_vecScale.z); // Анимация объекта if(g_iAnimActive) { animTest.m_lCurTime++; // Переход к следующему кадру if(animTest.m_lCurTime >= animTest.m_keyFrames[i] [animTest.m_iCurFrame]->m_lTimeDelay) { animTest.m_iCurFrame++; bFrameChanged = 1; animTest.m_lCurTime = 0; // Сброс счетчика кадров if(animTest.m_iCurFrame >= animTest.m_iNumFrames) { animTest.m_iCurFrame = 0; } } } } }


Я знаю, что код визуализации объектов может выглядеть сложным, но все не так плохо. Сперва я вызываю мою функцию vDraw3DObject() чтобы нарисовать пол. Если вы не заметили, пол я рисую для того, чтобы облегчить расположение объектов. Он представляет собой большую серую решетку, расположенную вдоль оси Y.

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

Поскольку анимационная сцена может содержать несколько объектов, я создал цикл, который перебирает каждый объект сцены. Логика цикла изображена на рис. 11.25.



Рис. 11.25. Логика визуализации

Если в цикле обрабатывается тот объект, который выбран в данный момент в редакторе, он отображается закрашенным, если нет — объект отображается в виде каркаса. Сама визуализация выполняется путем вызова функции vDisplayXYZ(). Она получает информацию о местоположении, вращении и масштабировании объекта и визуализирует его согласно этим данным. Данные о местоположении вращении и масштабировании берутся из соответствующих векторов объекта, хранящихся в данных кадра.

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

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


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