Я показал вам как написать классы подразделений, управлять подразделениями и анимировать их. Последняя тема, которую я затрону — загрузка и создание новых подразделений. В рассматриваемом примере программы есть функция с именем vInitializeUnits().
Последний тип анимации относится к перемещающимся подразделениям. Код, который я поместил в пример выглядит очень похоже на обработку анимации других действий, но в нем отсутствует код для передвижения подразделения по экрану.
Третий тип анимации относится к атакующим подразделениям. Код работает точно так же, как и код для обработки ожидающих подразделений — в нем кадр с изображением атакующего подразделения последовательно меняется, пока не будет достигнут конец анимационной последовательности, после чего воспроизведение начинается сначала.
Второе действие представляет собой разворот подразделения. Вот предназначенный для этого код:
// Поворот
ptrUnit->m_fRot += ptrUnit->m_Movement->m_fTurnSpeed;
// Сброс, если завершен полный разворот
if(ptrUnit->m_fRot > 360.0f)
ptrUnit->m_fRot -= 360.0f;
Первое действие представляет собой состояние «ничегонеделанья» или ожидания. Код для его обработки выглядит следующим образом:
ptrUnit->m_iCurStillFrame++;
if(ptrUnit->m_iCurStillFrame >=
ptrUnit->m_Animation->m_iNumStillFrames)
{
ptrUnit->m_iCurStillFrame = 0;
}
ptrUnit->m_iCurAnimFrame =
ptrUnit->m_Animation->m_iStartStillFrames +
(ptrUnit->m_iCurStillFrame * (UNITMANAGER_MAXOWNERS + 1));
Осталось только выполнить цикл, который будет перебирать все подразделения и отображать те из них, которые в данный момент активны. Выполняющий эту задачу фрагмент кода приведен ниже:
// Цикл перебирающий подразделения
for(int i = 0; i < m_UnitManager.m_iTotalUnitObjs; i++) {
// Устанавливаем указатель на подразделение
ptrUnit = &m_UnitManager.m_UnitObjs[i];
Все эти классы великолепны, но как насчет визуализации? Если вы откроете файл main.cpp из проекта D3DFrame_UnitTemplate, я покажу вам! Спускайтесь вниз до функции vInitTileVB().
Теперь, после того как базовая информация о подразделених загружена, вы можете создавать подразделения, которые будут использоваться в игре. Вы не можете модифицировать базовые типы, так что следует создавать новые объекты подразделений. Здесь в игру вступает член данных диспетчера подразделений с именем m_UnitObjs.
Данная функция получает в своем единственном параметре строку и ищет тип защиты с указанным именем. Если такой тип найден, функция возвращает указатель на него. Вот как выглядит код этого бриллианта:
CUnitDefense* CUnitManager::ptrGetDefenseType(char *szName)
{
int i;
CUnitDefense *ptrUnitDefense = NULL;
for(i = 0; i < m_iTotalDefObjs; i++) {
if(!stricmp(szName, m_DefenseObjs[i].m_szName)) {
Переменная m_iSplashRadius сообщает, какое количество повреждений может нанести разрыв снаряда, выпущенного из данного типа оружия. Это полезно для таких типов вооружения, как гранаты, катапульты и т.п. Радиус указывает количество блоков игрового поля, на которые распространяется действие взрыва.