Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Вниз

DirectInput8   Найти похожие ветки 

 
ink   (2005-07-28 22:34) [0]

Как можно узнать отпущена/нажата ли например - левая кнопка мыши?
DirectInput8.


 
Fosgen   (2005-07-28 22:43) [1]

Лезь на http://www.gamedev.ru/articles/ - там точно есть описание работы с DInput - сам оттуда статьи качал.


 
Sphinx ©   (2005-07-29 11:09) [2]

Поищи в сети книгу Краснова про DirectX - там подробно описана работа DirectInput


 
Мелкий ©   (2005-07-29 21:00) [3]


> ink   (28.07.05 22:34)  
> Как можно узнать отпущена/нажата ли например - левая кнопка
> мыши?
> DirectInput8.


А на чём пишешь? Если C++, то я буквально несколько дней назад тоже над вводом парился. Вроде всё понял, так что могу помочь, по мере сил конечно.


 
Sphinx ©   (2005-07-29 22:02) [4]

{==============================================================================
|                                                                            |
| оболочка над DirectInput позволяющая обеспечить быстрый доступ к           |
| мышке и клавиатуре в любых приложениях                                     |
|                                                                            |
==============================================================================}

unit uTDIControls;

interface

{==============================================================================
 подключаемые модули
==============================================================================}

uses
 Windows, DirectInput, uGameTypes, uGameConst;

{==============================================================================
 константы модуля
==============================================================================}

const
 { признак нажатой или отжатой клавиши }
 Key_Is_Down   = $80;
 Key_Is_Up     = 0;

type
 { класс контроллера - оболочки для DirectInput }
 TDIController = class (TObject)
   private
     // дополнительные данные класса
     FappWindowHandle          : THandle;              // указатель на ассоциированное окно

     // переменные зоны ограничения мыши
     FBoundsSet                : Boolean;              // признак ограничения движения мыши
     FBoundsLeft,                                      // размеры
     FBoundsTop,                                       //   области ограничений
     FBoundsWidth,                                     //   движения
     FBoundsHeight             : Integer;              //   мыши

     // основной интерфейс DirectInput
     FDirectInput8             : IDirectInput8;        // основной интерфейс DI
     FDirectInputAcquire       : Boolean;              // признак захвата интерфейса

     // мышь
     FDirectInputMouse         : IDirectInputDevice8;  // интерфейс устройства
     FDirectInputMouseAcquire  : Boolean;              // признак захвата мыши
     FMouseX,                                          // координаты мыши
     FMouseY,                                          //   X и Y - координаты курсора на экране
     FMouseZ                   : Integer;              //   Z - координата связанная с колесом мыши
     FMouseDX,                                         // приращения координат
     FMouseDY,                                         //   на предыдущем опросе
     FMouseDZ                  : Integer;              //
     FKMouseMove               : Single;               // коэф. влияющий на величину смещения мыши
     FDirectInputMouseKeyStat  : TMouseKeyStat;        // массив состояний клавишь

     // клавиатура
     FDirectInputKeyb          : IDirectInputDevice8;  // интерфейс устройства
     FDirectInputKeybAcquire   : Boolean;              // признак захвата клавиатуры
     FDirectInputKeybKeyStat   : TKeyboardStat;        // массив состояний кнопок

   protected
     FHRErrorCode              : HResult;              // переменная результатов

     procedure UpdateMouseData;
     procedure UpdateKeybData;
     function ResetKeybKey: TKeyboardStat;

     function GetMouseKeys: TMouseKeyStat;
     function GetKeybKeys: TKeyboardStat;

   public
     constructor Create(iHandle: THandle);
     destructor Destroy; override;

     property CurrentError: HResult read FHRErrorCode;

     property DirectInputAcquire: Boolean read FDirectInputAcquire;
     property DirectInputMouseAcquire: Boolean read FDirectInputMouseAcquire;
     property MouseX: Integer read FMouseX;
     property MouseY: Integer read FMouseY;
     property MouseZ: Integer read FMouseZ;
     property LastMouseDX: Integer read FMouseDX;
     property LastMouseDY: Integer read FMouseDY;
     property LastMouseDZ: Integer read FMouseDZ;
     property DirectInputKeyboardAcquire: Boolean read FDirectInputKeybAcquire;
     property MouseKeysStats: TMouseKeyStat read GetMouseKeys;
     property KeyboardKeysStats: TKeyboardStat read GetKeybKeys;

     procedure Update;
     function AcquireDirectInput: HResult;
     function AcquireMouse(startX, startY, startZ: Integer; KMove: Single): HResult;
     function UnAcquireMouse: HResult;
     procedure ResetMouseKey;
     procedure SetMouseBound(aLeft, aTop, aWidth, aHeight: Integer);
     procedure UnSetMouseBound;
     procedure SetMouseTo(iX, iY, iZ: Integer);
     function AcquireKeyboard: HResult;
     function UnAcquireKeyboard: HResult;
     procedure ResetKeyboardKey;
 end;

implementation

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                              FUNCTION                                      //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

{==============================================================================
==============================================================================}

function KeyIsDown(aKey: WORD): Boolean;
begin
 if (aKey and Key_Is_Down) = Key_Is_Down then
   Result := True
 else
   Result := False;
end;


 
Sphinx ©   (2005-07-29 22:03) [5]

////////////////////////////////////////////////////////////////////////////////
//                                                                            //
//                            TDIController                                   //
//                                                                            //
////////////////////////////////////////////////////////////////////////////////

{==============================================================================
 конструктор класса

 ===== входные величины =====
 iHandle:      указатель на окно, ассоциируемое с DirectInputDevice
==============================================================================}

constructor TDIController.Create(iHandle: THandle);
begin
 // проверка и защита от повторного создания
 if Assigned(FDirectInput8) then
   begin
     // заносится код что уже создано
     FHRErrorCode := DIERR_ALREADYINITIALIZED;
     Exit;
   end;
 if (iHandle = 0) then Exit;
 inherited Create;
 // обнуление некоторых переменных
 FappWindowHandle          := iHandle;
 FDirectInput8             := nil;
 FDirectInputMouse         := nil;
 FDirectInputAcquire       := False;
 FDirectInputMouseAcquire  := False;
 // обнуление переменных мыши
 FMouseX       := 0;
 FMouseY       := 0;
 FMouseZ       := 0;
 FMouseDX      := 0;
 FMouseDY      := 0;
 FMouseDZ      := 0;
 FKMouseMove   := 1.0;
 FBoundsSet    := False;
 FBoundsLeft   := 0;
 FBoundsTop    := 0;
 FBoundsWidth  := 0;
 FBoundsHeight := 0;
 // все кнопки задаются отжатыми
 ResetMouseKey;
 ResetKeyboardKey;
 // устанавливаем связь с DirectInput
 FHRErrorCode := DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, FDirectInput8, nil);
 if Succeeded(FHRErrorCode) then
   FDirectInputAcquire := True
 else
   FDirectInput8 := nil;
end;

{==============================================================================
 повторное создание связи с объектом DirectInput
==============================================================================}

function TDIController.AcquireDirectInput: HResult;
begin
 // проверка не создан ли уже интерфейс
 if Assigned(FDirectInput8) then
   begin
     FHRErrorCode := DIERR_ALREADYINITIALIZED;
     Result := FHRErrorCode;
     Exit;
   end;
 // устанавливаем связь с DirectInput
 FHRErrorCode := DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, FDirectInput8, nil);
 if Succeeded(FHRErrorCode) then
   FDirectInputAcquire := True
 else
   FDirectInput8 := nil;
 Result := FHRErrorCode;
end;

{==============================================================================
 деструктор класса
==============================================================================}

destructor TDIController.Destroy;
begin
 UnAcquireMouse;
 UnAcquireKeyboard;
 // освобождаем интерфейс мыши
 FDirectInputMouseAcquire := False;
 if Assigned(FDirectInputMouse) then
   begin
     FDirectInputMouse._Release;
     FDirectInputMouse := nil;
   end;
 // освобождаем интерфейс клавиатуры
 FDirectInputKeybAcquire := False;
 if Assigned(FDirectInputKeyb) then
   begin
     FDirectInputKeyb._Release;
     FDirectInputKeyb := nil;
   end;
 // освобождаем интерфейс DirectInput
 FDirectInputAcquire := False;
 if Assigned(FDirectInput8) then
   begin
     FDirectInput8._Release;
     FDirectInput8 := nil;
   end;
 inherited;
end;

{==============================================================================
 захват мыши

 ===== входные величины =====
 startX:     начальная горизонтальная позиция
 startY:     начальная вертикальная позиция
 KMove:      коэффициент приращения позиции курсора

==============================================================================}

function TDIController.AcquireMouse(startX, startY, startZ: Integer; KMove: Single): HResult;
begin
 // проверяем не создан ли уже объект мыши
 if Assigned (FDirectInputMouse) then
   begin
     // объект уже существует
     FHRErrorCode := DIERR_ALREADYINITIALIZED;
     Result := FHRErrorCode;
     Exit;
   end;
 // установка начальных значений
 FDirectInputMouseAcquire := False;
 FMouseX := startX;
 FMouseY := startY;
 FMouseZ := startZ;
 FKMouseMove := KMove;
 // создать объект - мышь
 FHRErrorCode := FDirectInput8.CreateDevice(GUID_SysMouse, FDirectInputMouse, nil);
 if Failed(FHRErrorCode) then
   begin
     FDirectInputMouse := nil;
     Result := FHRErrorCode;
     Exit;
   end;
 // установить формат принимаемых данных, уровень кооперации и связать с устройством
 FHRErrorCode := FDirectInputMouse.SetDataFormat(c_dfDIMouse2);
 if Succeeded(FHRErrorCode) then
   FHRErrorCode := FDirectInputMouse.SetCooperativeLevel(FappWindowHandle, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);
 if Succeeded(FHRErrorCode) then
   FHRErrorCode := FDirectInputMouse.Acquire;
 if Failed(FHRErrorCode) then
   begin
     FDirectInputMouse._Release;
     FDirectInputMouse := nil;
   end
 else
   FDirectInputMouseAcquire := True;
 Result := FHRErrorCode;
end;

{==============================================================================
 освобождение мыши
==============================================================================}

function TDIController.UnAcquireMouse: HResult;
begin
 Result := S_OK;
 if FDirectInputMouseAcquire then
   begin
     if Assigned(FDirectInputMouse) then
       begin
         FHRErrorCode := FDirectInputMouse.Unacquire;
         Result := FHRErrorCode;
         FDirectInputMouse._Release;
         FDirectInputMouse := nil;
       end;
     FDirectInputMouseAcquire := False;
   end;
 // все кнопки мыши задаются отжатыми
 ResetMouseKey;
end;

{==============================================================================
 сброс сосотояния всех кнопок мыши
==============================================================================}

procedure TDIController.ResetMouseKey;
begin
 FDirectInputMouseKeyStat[0] := False;
 FDirectInputMouseKeyStat[1] := False;
 FDirectInputMouseKeyStat[2] := False;
 FDirectInputMouseKeyStat[3] := False;
 FDirectInputMouseKeyStat[4] := False;
 FDirectInputMouseKeyStat[5] := False;
 FDirectInputMouseKeyStat[6] := False;
 FDirectInputMouseKeyStat[7] := False;
end;


 
Sphinx ©   (2005-07-29 22:05) [6]

{==============================================================================
 установка прямоугольника, ограничивающего движение курсора мыши
==============================================================================}

procedure TDIController.SetMouseBound(aLeft, aTop, aWidth, aHeight: Integer);
begin
 FBoundsLeft   := aLeft;
 FBoundsTop    := aTop;
 FBoundsWidth  := aWidth;
 FBoundsHeight := aHeight;
 FBoundsSet    := True;
end;

{==============================================================================
 убрать ограничения на перемещение мыши
==============================================================================}

procedure TDIController.UnSetMouseBound;
begin
 FBoundsSet := False;
end;

{==============================================================================
 обновление данных мыши
==============================================================================}

procedure TDIController.UpdateMouseData;
var
 DirectInputMouseKey : TDIMouseState2;
begin
 // если связь и мышью не установлена
 if not(Assigned(FDirectInputMouse)) then
   begin
     // объект не создан
     FHRErrorCode := DIERR_NOTINITIALIZED;
     Exit;
   end;
 // подготовка переменной
 ZeroMemory(@DirectInputMouseKey, SizeOf (TDIMouseState2));
 // получить данные от мыши
 FHRErrorCode := FDirectInputMouse.GetDeviceState(SizeOf(TDIMouseState2), @DirectInputMouseKey);
 // проверка не потеряна ли связь с устройством
 if Failed(FHRErrorCode) then
   begin
     while ((FHRErrorCode = DIERR_INPUTLOST) or (FHRErrorCode = DIERR_NOTACQUIRED)) do
       FHRErrorCode := FDirectInputMouse.Acquire;
     Exit;
   end;
 if Failed(FHRErrorCode) then Exit;
 // проверяем состояние клавишь мыши
 FDirectInputMouseKeyStat[0] := KeyIsDown(DirectInputMouseKey.rgbButtons[0]);
 FDirectInputMouseKeyStat[1] := KeyIsDown(DirectInputMouseKey.rgbButtons[1]);
 FDirectInputMouseKeyStat[2] := KeyIsDown(DirectInputMouseKey.rgbButtons[2]);
 FDirectInputMouseKeyStat[3] := KeyIsDown(DirectInputMouseKey.rgbButtons[3]);
 FDirectInputMouseKeyStat[4] := KeyIsDown(DirectInputMouseKey.rgbButtons[4]);
 FDirectInputMouseKeyStat[5] := KeyIsDown(DirectInputMouseKey.rgbButtons[5]);
 FDirectInputMouseKeyStat[6] := KeyIsDown(DirectInputMouseKey.rgbButtons[6]);
 FDirectInputMouseKeyStat[7] := KeyIsDown(DirectInputMouseKey.rgbButtons[7]);
 // записываем текущие смещения
 FMouseDX := DirectInputMouseKey.lX;
 FMouseDY := DirectInputMouseKey.lY;
 FMouseDZ := DirectInputMouseKey.lZ;
 // вычисляем координаты мыши
 FMouseX := FMouseX + round(DirectInputMouseKey.lX * FKMouseMove);
 FMouseY := FMouseY + round(DirectInputMouseKey.lY * FKMouseMove);
 FMouseZ := FMouseZ + round(DirectInputMouseKey.lZ); { нет умножения на коэф. !!! }
 // если движения мыши ограничены - проверить
 if FBoundsSet then
   begin
     if FMouseX < FBoundsLeft then
       FMouseX := FBoundsLeft;
     if FMouseX > (FBoundsLeft + FBoundsWidth) then
       FMouseX := (FBoundsLeft + FBoundsWidth);
     if FMouseY < FBoundsTop then
       FMouseY := FBoundsTop;
     if FMouseY > (FBoundsTop + FBoundsHeight) then
       FMouseY := (FBoundsTop + FBoundsHeight);
   end;
end;

{==============================================================================
==============================================================================}

procedure TDIController.SetMouseTo(iX, iY, iZ: Integer);
begin
 FMouseX := iX;
 FMouseY := iY;
 FMouseZ := iZ;
end;

{==============================================================================
 "захват" клавиатуры
==============================================================================}

function TDIController.AcquireKeyboard: HResult;
var
 DIPDW: TDIPropDWord;
begin
 // проверка не существует ли уже объект
 if Assigned(FDirectInputKeyb) then
   begin
     FHRErrorCode := DIERR_ALREADYINITIALIZED;
     Result := FHRErrorCode;
     Exit;
   end;
 // создаем интерфейс устройства
 FHRErrorCode := FDirectInput8.CreateDevice(GUID_SysKeyboard, FDirectInputKeyb, nil);
 // задаем формат данных
 if Succeeded(FHRErrorCode) then
   FHRErrorCode := FDirectInputKeyb.SetDataFormat(c_dfDIKeyboard);
 // устанавливаем уровень кооперации
 if Succeeded(FHRErrorCode) then
   FHRErrorCode := FDirectInputKeyb.SetCooperativeLevel(FappWindowHandle, DISCL_NONEXCLUSIVE or DISCL_FOREGROUND);
 // устанавливаем параметры буфера
 if Succeeded(FHRErrorCode) then
   begin
     ZeroMemory(@DIPDW, Sizeof(DIPDW));
     with DIPDW do
       begin
         diph.dwSize := Sizeof(TDIPropDWord);
         diph.dwHeaderSize := Sizeof(TDIPropHeader);
         diph.dwObj := 0;
         diph.dwHow := DIPH_DEVICE;
         dwData := DIKeyboardBuffer;
       end;
     FHRErrorCode := FDirectInputKeyb.SetProperty(DIPROP_BUFFERSIZE, DIPDW.diph);
   end;
 // устанавливаем связь с клавиатурой
 if Succeeded(FHRErrorCode) then
   FHRErrorCode := FDirectInputKeyb.Acquire;
 // если какая-то операция была провалена - обнуляем объект
 if Failed(FHRErrorCode) then
   begin
     FDirectInputKeyb._Release;
     FDirectInputKeyb := nil;
   end
 else
   FDirectInputKeybAcquire := True;
 Result := FHRErrorCode;
end;

{==============================================================================
 "освобождаем" клавиатуру
==============================================================================}

function TDIController.UnAcquireKeyboard: HResult;
begin
 Result := S_OK;
 if FDirectInputKeybAcquire then
   begin
     if Assigned(FDirectInputKeyb) then
       begin
         FHRErrorCode := FDirectInputKeyb.Unacquire;
         Result := FHRErrorCode;
         FDirectInputKeyb._Release;
         FDirectInputKeyb := nil;          
       end;
     FDirectInputKeybAcquire := False;
   end;
 ResetKeyboardKey;
end;

{==============================================================================
 сброс всех кнопок клавиатуры
==============================================================================}

function TDIController.ResetKeybKey: TKeyboardStat;
var
 i: Byte;
begin
 for i := 0 to 255 do
   Result[i] := False;
end;

{==============================================================================
 надстройка над функцией сброса состояния кнопок клавиатуры    
==============================================================================}

procedure TDIController.ResetKeyboardKey;
begin
 FDirectInputKeybKeyStat := ResetKeybKey;
end;


 
Sphinx ©   (2005-07-29 22:07) [7]

{==============================================================================
 обновление данный о состоянии кнопок клавиатуры
==============================================================================}

procedure TDIController.UpdateKeybData;
var
 DirectInputKeybKey: array[0..DIKeyboardBuffer - 1] of TDIDeviceObjectData;
 dwElements: Cardinal;
 i: Cardinal;
begin
 // проверка на существование объекта
 if not(Assigned(FDirectInputKeyb)) then
   begin
     FHRErrorCode := DIERR_NOTINITIALIZED;
     Exit;
   end;
 // подготовка данных
 ZeroMemory(@DirectInputKeybKey, Sizeof(DirectInputKeybKey));
 dwElements := DIKeyboardBuffer;
 // получить данные из буфера клавиатуры
 FHRErrorCode := FDirectInputKeyb.GetDeviceData(SizeOf(TDIDeviceObjectData), @DirectInputKeybKey, dwElements, 0);
 // проверка на наличае связи с устройством и её установление
 if Failed(FHRErrorCode) then
   begin
     while ((FHRErrorCode = DIERR_INPUTLOST) or (FHRErrorCode = DIERR_NOTACQUIRED)) do
       FHRErrorCode := FDirectInputMouse.Acquire;
     Exit;
   end;
 // если связь с устройством не восстановлена - выйти
 if Failed(FHRErrorCode) then Exit;
 // обновление статуса кнопок
 if dwElements <> 0 then
   for i := 0 to dwElements - 1 do
     FDirectInputKeybKeyStat[DirectInputKeybKey[i].dwOfs] := KeyIsDown(DirectInputKeybKey[i].dwData);
end;

{==============================================================================
 обновить данные класса
==============================================================================}

procedure TDIController.Update;
begin
 UpdateMouseData;  // обновить данные мышы
 UpdateKeybData;   // обновить данные клавиатуры
end;

{==============================================================================
 получить ланные о состоянии клавишь мыши
==============================================================================}

function TDIController.GetMouseKeys: TMouseKeyStat;
begin
 Result := FDirectInputMouseKeyStat;
end;

{==============================================================================
 получить данные о кнопках клавиатуры
==============================================================================}

function TDIController.GetKeybKeys: TKeyboardStat;
begin
 Result := FDirectInputKeybKeyStat;
end;

end.


in uGameTypes.pas
 // структуры данных для контроллера DirectInput
 TMouseKeyStat = array[0..7] of Boolean;         // массив состояний клавишь мыши
 TKeyboardStat = array[0..255] of Boolean;       // массив состояний кнопок клавиатуры


in uGameConst.pas
 DIKeyboardBuffer = 16;                              // размер буфера клавиатуры


 
Sphinx ©   (2005-07-29 22:08) [8]

Лишнее - уберите, но принцип тут показан
клавиатура читется буферизованно,
мышь - непосредственно.


 
ink   (2005-07-30 15:38) [9]

Спасибо ребята!



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2006.01.01;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.017 c
14-1133868566
syte_ser78
2005-12-06 14:29
2006.01.01
Вопрос по возможностям электропитания ЮСБ устройства


14-1133991117
beglec
2005-12-08 00:31
2006.01.01
вопрос по геометрии


3-1131727185
suharew
2005-11-11 19:39
2006.01.01
как узанть есть ли тигер у таблицы??


14-1133245337
Igorek
2005-11-29 09:22
2006.01.01
Смотрю я на банер.. то ли лыжи не едут...


2-1134575728
fast2
2005-12-14 18:55
2006.01.01
Подскажите, в чем ошибка?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский