DXInput

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

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

begin

//действие

end

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

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

if isUp in .States then

begin

//действие

end

//а это - без

if Key=VK_UP then

begin

//действие

end

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

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

,где:X - значение от 0 до 2 (то есть на каждый "тикер" можно присвоить до трех <кнопок>)<кнопка> - код кнопки (например ord('Q')).Примечание: буквенные клавиши указываются в верхнем регистре,т.е. .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;

//обновим состояние (нужно делать при каждом тике таймера)

.Update;

DXDraw.Surface.Fill(0);

If isUP in .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

.Keyboard.KeyAssigns[isUp,0]:=ord('E');

//за [isUp,1] - по умолчанию зарезервирована "стрелка вверх", оставим ее.

.Keyboard.KeyAssigns[isUp,2]:=ord('I');

end;

2. Мышь
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;

.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 до -XDXinput.Joystick.RangeY = 0 - 1000, устанавливает диапазон изменения значений по вертикальной оси от Y до -YDXinput.Joystick.RangeZ = 0 - 1000, устанавливает диапазон изменения значений по третьей оси от Z до -ZDXinput.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 1.Joystick.ButtonCount do

begin

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

begin

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

end;

end;

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

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...