DXInput

Материал из DRKB


DXInput

В этой статье мы рассмотрим методы управления объектами в играх с помощью клавиатуры, мыши и джойстика..


Клавиатура[править | править код]

Опрос нажатия клавиши ведется через DXInput.States:

if <тикер> in DXInput.States then
begin
  // действие
end;

где <тикер> есть зарезервированное слово:

  • isUp - по умолчанию "стрелка вверх"
  • isDown - по умолчанию "стрелка вниз"
  • isRight - по умолчанию "стрелка вправо"
  • isLeft - по умолчанию "стрелка влево"
  • IsButton1 - по умолчанию "Space"
  • IsButton2 - по умолчанию "Enter"
  • IsButton3-IsButton32 - по умолчанию не определены


Для сравнения два равноценных условия:

// c использования DXInput
if isUp in DXInput.States then
begin
  // действие
end;

// а это - без
if Key = VK_UP then
begin
  // действие
end;


Чтобы определить "тикер":

DXInput.Keyboard.KeyAssigns[<тикер>, X] := <кнопка>

где:

  • X - значение от 0 до 2 (то есть на каждый "тикер" можно присвоить до трех <кнопок>)
  • <кнопка> - код кнопки (например ord('Q')).
Примечание
буквенные клавиши указываются в верхнем регистре, т.е. DXInput.Keyboard.KeyAssigns[isButton10, X] := Ord('q') не будет реагировать на нажатие клавиши 'q'


Кнопки Ctrl, Alt, Shift можно опросить обычным способом:

if (ssCtrl in Shift) then ...
if (ssAlt in Shift) then ...
if (ssShift in Shift) then ...


Небольшой примерчик. Закрепим за тикером isUp - кнопки "E", "I" и "стрелка вверх":

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
begin
  if not DXDraw.CanDraw then exit;
  // обновим состояние DXInput (нужно делать при каждом тике таймера)
  DXInput.Update;
  DXDraw.Surface.Fill(0);
  if isUP in DXInput.States then
  begin
    with DXDraw.Surface.Canvas do
    begin
      Brush.Style := bsClear;
      Font.Color := clWhite;
      Font.Size := 12;
      TextOut(50, 50, 'UP pressed');
      Release;
    end;
  end;
  DXDraw.Flip;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DXInput.Keyboard.KeyAssigns[isUp, 0] := Ord('E');
  // за [isUp,1] - по умолчанию зарезервирована "стрелка вверх", оставим ее.
  DXInput.Keyboard.KeyAssigns[isUp, 2] := Ord('I');
end;


Мышь[править | править код]

  • DXinput.Mouse.X - положение курсора по горизонтали
  • DXinput.Mouse.Y - положение курсора по вертикали
  • DXinput.Mouse.Z - положение курсора по третьей оси

Небольшой примерчик:

var
  Form1: TForm1;
  MouseX, MouseY: Integer;
  LeftB, RightB: Boolean;

implementation

{$R *.DFM}

procedure TForm1.DXTimerTimer(Sender: TObject; LagCount: Integer);
var
  Shift: TShiftState;
begin
  if not DXDraw.CanDraw then Exit;
  DXInput.Update;
  DXDraw.Surface.Fill(0);
  with DXDraw.Surface.Canvas do
  begin
    Brush.Style := bsClear;
    Font.Color := clWhite;
    Font.Size := 12;
    if LeftB then
      TextOut(0, 0, 'Left');
    if RightB then
      TextOut(50, 0, 'Right');
    TextOut(0, 50, IntToStr(MouseX) + ',' + IntToStr(MouseY));
    Release;
  end;
  DXDraw.Flip;
end;

procedure TForm1.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  MouseX := X;
  MouseY := Y;
end;

Procedure TForm1.DXDrawMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ssLeft in Shift then LeftB := True;
  if ssRight in Shift then RightB := True;
end;

procedure TForm1.DXDrawMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  LeftB := False;
  RightB := False;
end;


Джойстик[править | править код]

Настроим джойстик:

  • DXinput.Joystick.RangeX = 0 - 1000, устанавливает диапазон изменения значений по горизонтальной оси от X до -X
  • DXinput.Joystick.RangeY = 0 - 1000, устанавливает диапазон изменения значений по вертикальной оси от Y до -Y
  • DXinput.Joystick.RangeZ = 0 - 1000, устанавливает диапазон изменения значений по третьей оси от Z до -Z
  • DXinput.Joystick.DeadzoneX = 0 - 100, устанавливает чувствительность по горизонтальной оси
  • DXinput.Joystick.DeadzoneY = 0 - 100, устанавливает чувствительность по вертикальной оси
  • DXinput.Joystick.DeadzoneZ = 0 - 100, устанавливает чувствительность по третьей оси

0 - самое чувствительное значение.


Читаем положение рукоятки:

  • DXinput.Joystick.X - по горизонтальной оси
  • DXinput.Joystick.Y - по вертикальной оси
  • DXinput.Joystick.Z - по третьей оси

Z - используется в случае наличия на джойстике соответствующей ручки.


Этот кусок кода сканирует кнопки на джойстике:

for i := 0 to DXInput1.Joystick.ButtonCount do
begin
  if DXInput1.Joystick.Buttons[i] = True then
  begin
    // Кнопка нажата. Действие.
  end;
end;


Примечание
Руль можно считать частным случаем джойстика. При этом штурвал - горизонтальная ось (X), педаль газа и педаль тормоза - вертикальная ось (Y).


Source: http://www.mirgames.ru
ID: 03921
ID: 03925