Структура этой программы редактирования карт практически полностью повторяет структуру предыдущего примера. Главные отличия сконцентрированы в функции генерации карты. Ее цель — генерировать случайно расположенные участки суши, базируясь на передаваемом в качестве параметра номере используемого алгоритма.
Функция vRender() занимается отображением блочной карты. В ней я в цикле перебираю блоки карты и отображаю текстуры, соответствующие номерам блоков. Вот код цикла визуализации:
// Сверху вниз
for(iY = 0; iY < g_iTilesHigh; iY++) {
// Справа налево
for(iX = 0; iX < g_iTilesWide; iX++) {
// Вычисляем смещение в буфере
iBufferPos = iX + g_iXPos + ((iY + g_iYPos) * g_iMapWidth);
Функция vInitMap() отвечает за создание случайной карты. Взгляните как выглядит код, выполняющий эти действия:
void vInitMap(void)
{
int i;
// Заполнение карты случайными блоками
for(i = 0; i < g_iMapWidth * g_iMapHeight; i++) {
g_iTileMap[i] = rand()%3;
}
}
В заголовочном файле main.h проекта находится несколько исключительно важных типов данных, используемых для просмотра карты. Вот их краткий список:
int g_iTileSize = 32;
int g_iTilesWide = 20;
int g_iTilesHigh = 15;
int g_iMapWidth = 100;
int g_iMapHeight = 100;
int g_iXPos = 0;
int g_iYPos = 0;
int g_iTileMap[10000];
Область редактирования — это компонент редактора карт в котором осуществляется фактическое редактирование карты. Обычно область редактирования представляет вид на карту, который во многом, если не полностью, идентичен тому, что видит пользователь во время игры.
Вернемся к функции WinMain() и рассмотрим следующий фрагмент кода:
while(msg.message != WM_QUIT) {
if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else {
// Чтение из буфера клавиатуры
iResult = iReadKeyboard();
// Проверяем, сколько нажатий на клавиши возвращено
if(iResult) {
// Цикл обработки полученных данных
Откройте файл main.cpp и найдите код функции WinMain(). В ней вы найдете обычный код создания объектов Windows, за которым следует код инициализации DirectInput и устройства клавиатуры, выглядящий так:
// Инициализация DirectInput
iResult = iInitDirectInput();
if(iResult != INPUTERROR_SUCCESS) {
MessageBox(hWnd, "DirectInput Error",
"Unable to initialize Direct Input.", MB_ICONERROR);
vCleanup();
exit(1);
}
То, что вы прочитали можно назвать самым коротким обзором DirectInput. Причина подобной краткости в том, что стратегические игры не требуют сложных устройств ввода. Нет никакой необходимости использовать устройства с обратной связью, джойстики, игровые пульты и другие подобные устройства.
Объект DirectInput создает устройства в виде объектов интерфейса IDirectInputDevice8. Интерфейс IDirectInputDevice8 выполняет большую часть работы по поддержке конкретного устройства. Чтобы создать интерфейс устройства вы должны вызвать метод CreateDevice() главного объекта DirectInput. Вот как выглядит его прототип:
HRESULT CreateDevice(
REFGUID rguid,
Второе действие представляет собой разворот подразделения. Вот предназначенный для этого код:
// Поворот
ptrUnit->m_fRot += ptrUnit->m_Movement->m_fTurnSpeed;
// Сброс, если завершен полный разворот
if(ptrUnit->m_fRot > 360.0f)
ptrUnit->m_fRot -= 360.0f;