Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизDXInput Найти похожие ветки
← →
Wish © (2004-11-06 16:09) [0]Как сделать чтобы isup, isdown, isleft и isright работали только для клавы, несмотря на то что DXInput работает и с мышкой, потому что в моей программе используется и клава и кнопка мыши.
← →
cyborg © (2004-11-06 22:00) [1]Обыкновенно. Смотри кнопки клавиатуры, а не мышки.
← →
Sphinx (2004-11-06 22:11) [2]Что-то в этом духе:
Buffer_Size = 8; // размер буфера клавиатуры
KEY_DOWN = $80; // клавиша нажата
KEY_UP = $0; // клавиша отжата
DIKeyboard: IDirectInputDevice8;
function InitKeyboard: HResult;
var
DIRes: HResult; // результаты операций
DIPDWord: TDIPropDWord; // дополнительная переменная для
// задания параметров буфера клавиатуры
begin
// создание главного объекта Direct Input
DIRes:=DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, DInput, nil);
// если создать объект не удалось
if DIRes<>DI_OK then
begin
// почему не создан объект
Result:=DIRes;
Exit;
end;
// создание объекта ввода с клавиатуры
DIRes:=DInput.CreateDevice(GUID_SysKeyboard, DIKeyboard, nil);
if DIRes<>DI_OK then
begin
Result:=DIRes;
Exit;
end;
// задание формата данных, получаемых от клавиатуры
DIRes:=DIKeyboard.SetDataFormat(c_dfDIKeyboard);
if DIRes<>DI_OK then
begin
Result:=DIRes;
Exit;
end;
// задание уровня кооперации
DIRes:=DIKeyboard.SetCooperativeLevel(mainHandle, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);
if DIRes<>DI_OK then
begin
Result:=DIRes;
Exit;
end;
// Параметры для буферной схемы получения данных
ZeroMemory(@DIPDWord, SizeOf(DIPDWord));
with DIPDWord do
begin
diph.dwSize:=SizeOf(TDIPropDWord);
diph.dwHeaderSize:=SizeOf(TDIPropHeader);
diph.dwObj:=0;
diph.dwHow:=DIPH_DEVICE;
dwData:=BUFFER_SIZE;
end;
// указываем свойства буферизации ввода с клавиатуры
DIRes:=DIKeyboard.SetProperty(DIPROP_BUFFERSIZE, DIPDWord.diph);
if DIRes<>DI_OK then
begin
Result:=DIRes;
Exit;
end;
// создаем связь приложения с клавиатурой
Result:=DIKeyboard.Acquire;
end;
(* считывание данный из буфера клавиатуры *)
function KeyboardReadData: HResult;
var
DIRes: HResult; // результаты операций
DIKey: array[0..BUFFER_SIZE-1] of TDIDeviceObjectData; // буфер клавиатуры
dwElements: DWORD; // число элементов в буфере клавиатуры
i: DWORD; // вспомогательная переменная цикла
begin
Result:=DI_OK;
if not(appActive) then Exit;
// если объект клавиатуры существует
if DIKeyboard=nil then Exit;
Result:=E_FAIL;
// обнуляем переменную буфера клавиатуры
ZeroMemory(@DIKey, SizeOf(DIKey));
// получить данные в буфер
DIRes:=DIKeyboard.GetDeviceData(SizeOf(TDIDeviceObjectData), @DIKey, dwElements, 0);
// если данные не получены
if DIRes<>DI_OK then
begin
// проверяем наличае связи
DIRes:=DIKeyboard.Acquire;
// пытаемся восстановить связь с клавиатурой
while DIRes=DIERR_INPUTLOST do
DIRes:=DIKeyboard.Acquire;
Exit;
end;
// если в буфере имеются данные
if dwElements<>0 then
// пройтись по всему буферу
for i:=0 to dwElements-1 do
begin
// если нажата клавиша ESC
if DIKey[i].dwOfs=DIK_ESCAPE then ScreenCount:=1;
// увеличить скорость
if DIKey[i].dwOfs=DIK_ADD then Dec(AniSpeed, 5);
// уменьшить скорость
if DIKey[i].dwOfs=DIK_SUBTRACT then Inc(AniSpeed, 5);
end;
// в итоге результат - положительный
Result:=DI_OK;
end;
← →
Sphinx (2004-11-06 22:19) [3]и еще забыл...перед закрытием программы не забудь:
// освобождение устройств ввода
if Assigned(DIKeyboard) then DIKeyboard.Unacquire;
if Assigned(DIKeyboard) then DIKeyboard:=nil;
if Assigned(DInput) then DInput:=nil;
Страницы: 1 вся ветка
Форум: "Игры";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.117 c