DXInput

Previous  Top  Next

    
 

DXInput

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

1. Клавиатура.

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

Code:

if <тикер> in DXInput.States then

begin

//действие

 

end

 

 

 

 
 

,где <тикер> есть зарезервированное слово:
isUp - по умолчанию "стрелка вверх"
isDown - по умолчанию "стрелка вниз"
isRight - по умолчанию "стрелка вправо"
isLeft - по умолчанию "стрелка влево"
IsButton1 - по умолчанию "Space"
IsButton2 - по умолчанию "Enter"
IsButton3-IsButton32 - по умолчанию не определены
 
Для сравнения два равноценных условия:

 

 

//c использования DXInput

Code:

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 можно опросить обычным способом:

Code:

If (ssCtrl in Shift) then ...

If (ssAlt in Shift) then ...

If (ssShift in Shift) then ...

 

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

Code:

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

With DXDraw.Surface.Canvas do

begin

Brush.Style := bsClear;

Font.Color := clWhite;

Font.Size := 12;

TextOut(50,50,'UP pressed');

Release;

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;

 

2. Мышь
 

DXinput.Mouse.X - положение курсора по горизонтали
DXinput.Mouse.Y - положение курсора по вертикали
DXinput.Mouse.Z - положение курсора по третьей оси
 
Небольшой примерчик:

Code:

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;

 

 

 
 

3. Джойстик
 

Настроим джойстик:
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 - используется в случае наличия на джойстике соответствующей ручки.
Этот кусок кода сканирует кнопки на джойстике:

 

Code:

For i := 0 to DXInput1.Joystick.ButtonCount do

begin

if DXInput1.Joystick.Buttons[i] = True then

begin

//Кнопка нажата. Действие.

end;

end;

 

 

 

 

 

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

 

http://www.mirgames.ru

©Drkb::03921