DXInput

Автор: DaddyWEB-сайт: http://daddy.mirgames.ru В этой статье мы рассмотрим методы управления объектами в играх с помощью клавиатуры, мыши и джойстика..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).


DelphiWorld 6.0

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

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