DXInput

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
Category:Графика
Category:DirectX