/* input.c */ /* включение guids */ #define INITGUID /* используем 8-ю версию DirectInput */ #define DIRECTINPUT_VERSION 0x0800 /* включение заголовков */ #include "global.h" #include #include "input.h" /* описание ввода */ GAMEINPUT input; /* локальные переменные */ static LPDIRECTINPUT8 lpdi; /* основной интерфейс DirectInput */ static LPDIRECTINPUTDEVICE8 lpdiKey; /* интерфейс клавиатуры */ static LPDIRECTINPUTDEVICE8 lpdiMouse; /* интерфейс мыши */ /* флаги сигнализирующие о нажатии клавиши */ static struct { int p; } flags; /* проверка нажатие кнопки */ #define DIKEYDOWN(data,n) ((data)[(n)] & 0x80) /* получить ввод данных */ int GameInput(void) { UCHAR keyState[256]; DIMOUSESTATE mouseState; /* получим данные клавиатуры */ if (FAILED(IDirectInputDevice8_GetDeviceState(lpdiKey, sizeof(keyState),keyState))) return 1; /* получим данные мыши */ if (FAILED(IDirectInputDevice8_GetDeviceState(lpdiMouse, sizeof(DIMOUSESTATE),&mouseState))) return 1; /* очищаем структуру ввода */ memset(&input,0,sizeof(input)); /* обрабатываем события клавиатуры */ if (DIKEYDOWN(keyState,DIK_K)) input.K = 1; if (DIKEYDOWN(keyState,DIK_L)) input.L = 1; if (DIKEYDOWN(keyState,DIK_SPACE)) input.SPACE = 1; if (DIKEYDOWN(keyState,DIK_P)) { if (!flags.p) { input.P = 1; flags.p = 1; } } else { flags.p = 0; } /* обрабатываем события мыши */ if (mouseState.rgbButtons[0]) input.lButton = 1; input.x = mouseState.lX; return 0; } /* инициализация модуля ввода данных */ int InitInput(void) { /* создание интерфейса DirectInput */ if (FAILED(DirectInput8Create(ghInst,DIRECTINPUT_VERSION, &IID_IDirectInput8,&lpdi,NULL))) return 1; /* создание устройства клавиатуры */ if (FAILED(IDirectInput8_CreateDevice(lpdi,&GUID_SysKeyboard, &lpdiKey,NULL))) return 1; /* устанавливаем уровень взаимодействия для клавиатуры */ if (FAILED(IDirectInputDevice8_SetCooperativeLevel(lpdiKey, ghWndMain,DISCL_BACKGROUND|DISCL_NONEXCLUSIVE))) return 1; /* определяем формат данных */ if (FAILED(IDirectInputDevice8_SetDataFormat(lpdiKey,&c_dfDIKeyboard))) return 1; /* получаем клавиатуру */ if (FAILED(IDirectInputDevice8_Acquire(lpdiKey))) return 1; /* создаем устройство мыши */ if (FAILED(IDirectInput8_CreateDevice(lpdi,&GUID_SysMouse, &lpdiMouse,NULL))) return 1; /* задаем уровень взаимодействия для мыши */ if (FAILED(IDirectInputDevice8_SetCooperativeLevel(lpdiMouse, ghWndMain,DISCL_BACKGROUND|DISCL_NONEXCLUSIVE))) return 1; /* задаем формат данных */ if (FAILED(IDirectInputDevice8_SetDataFormat(lpdiMouse,&c_dfDIMouse))) return 1; /* захватываем мышь */ if (FAILED(IDirectInputDevice8_Acquire(lpdiMouse))) return 1; return 0; } /* освобождение модуля ввода данных */ void ReleaseInput(void) { /* возвратим клавиатуру */ if (lpdiKey) { IDirectInputDevice8_Unacquire(lpdiKey); IDirectInputDevice8_Release(lpdiKey); } /* возвратим мышь */ if (lpdiMouse) { IDirectInputDevice8_Unacquire(lpdiMouse); IDirectInputDevice8_Release(lpdiMouse); } /* освободим интерфейс DirectInput */ if (lpdi) IDirectInput8_Release(lpdi); }