В этой статье мы рассмотрим методы управления объектами в играх с помощью
клавиатуры, мыши и джойстика.. 1. Клавиатура. Опрос нажатия клавиши
ведется через 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 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 - положение курсора по третьей оси
Небольшой
примерчик: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 - используется в случае
наличия на джойстике соответствующей ручки. Этот кусок кода сканирует кнопки на
джойстике:for i := 0 to DXInput1.Joystick.ButtonCount do begin if DXInput1.Joystick.Buttons[i] = True then begin //Кнопка нажата. Действие. end; end;
|