netlib.narod.ru< Назад | Оглавление | Далее >

DirectInput и клавиатура

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

IDirectInputDevice8* InitKeyboard(HWND hWnd, IDirectInput8 *pDI)
{
    IDirectInputDevice8 *pDIDevice;

    // Создание объекта устройства
    if(FAILED(pDI->CreateDevice(GUID_SysKeyboard,
                                &pDIDevice, NULL)))
        return NULL;

    // Установка формата данных
    if(FAILED(pDIDevice->SetDataFormat(&c_dfDIKeyboard))) {
        pDIDevice->Release();
        return NULL;
    }

    // Установка режима кооперации
    if(FAILED(pDIDevice->SetCooperativeLevel(hWnd,
                 DISCL_FOREGROUND | DISCL_NONEXCLUSIVE))) {
        pDIDevice->Release();
        return NULL;
    }

    // Захватываем устройство для использования
    if(FAILED(pDIDevice->Acquire())) {
        pDIDevice->Release();
        return NULL;
    }

    // Если все успешно, возвращаем указатель
    return pDIDevice;
}

Функция InitKeyboard точно следует тому, о чем я говорил в этой главе. В следующем разделе, «DirectInput и мышь», вы увидите, что код инициализации мыши очень похож, и в результате я в ядре создам общую функцию для обоих устройств. Для чтения поступающих от клавиатуры данных вы можете использовать функцию ReadData.

Сперва вы должны понять,как клавиатура хранит данные. Вы должны предоставить массив из 256 байт, в котором каждый байт хранит состояние единственной клавиши. Это позволяет вам представлять 256 клавиш. Каждый байт хранит информацию о текущем состоянии клавиши — нажата она или нет. Чтобы определить состояние клавиши, проверьте старший бит (бит 7). Если он установлен — клавиша нажата; если сброшен — клавиша отпущена.

ПРИМЕЧАНИЕ
У каждой клавиши есть назначенный ей DirectInput макрос с префиксом DIK_. Так, клавиша A определена как DIK_A, клавиша Esc — как DIK_ESCAPE и т.д. Остальные макросы вы найдете в документации DX SDK или в файле DInput.h.

Вот пример создания и чтения клавиатуры:

// Убедитесь в наличии инициализированных глобального
// объекта DirectInput и дескриптора родительского окна
// в переменных g_pDI и g_hWnd
IDirectInputDevice8 *pDIDKeyboard;

// Буфер данных для хранения состояний клавиш
char KeyStateBuffer[256];

if((pDIDKeyboard = InitKeyboard(g_hWnd, g_pDI)) != NULL) {
    // Читаем данные
    ReadData(pDIDKeyboard, (void*)KeyStateBuffer, 256);
}

Вы можете создать макрос, упрощающий проверку того, нажата клавиша или отпущена. Этот макрос возвращает TRUE, если клавиша нажата, и FALSE — если отпущена.

#define KeyState(x) ((KeyStateBuffer[x] & 0x80) ? TRUE : FALSE)

Вот пример использования этого макроса:

if(KeyState(VK_LEFT) == TRUE) {
    // Нажата стрелка влево
}

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz