оружие

Загрузка и создание подразделений

Я показал вам как написать классы подразделений, управлять подразделениями и анимировать их. Последняя тема, которую я затрону — загрузка и создание новых подразделений. В рассматриваемом примере программы есть функция с именем 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));

Рисование подразделений

Все эти классы великолепны, но как насчет визуализации? Если вы откроете файл main.cpp из проекта D3DFrame_UnitTemplate, я покажу вам! Спускайтесь вниз до функции vInitTileVB().

Создание подразделений

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

Функция CUnitManager::ptrGetDefenseType()

Данная функция получает в своем единственном параметре строку и ищет тип защиты с указанным именем. Если такой тип найден, функция возвращает указатель на него. Вот как выглядит код этого бриллианта:

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)) {

Функция CUnitAnimation::vReset()

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

void CUnitAnimation::vReset(void)
{
memset(m_szName, 0x00, 64);
memset(m_szBitmapPrefix, 0x00, 64);
// Освобождаем память текстур

Данные текстуры при анимации

Указатель m_Textures применяется для хранения кадров анимации подразделения. Он указывает на массив объектов CTexture и замечательно справляется с задачей хранения информации.



RSS-материал