Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

DXInput

Delphi , Графика и Игры , DirectX и DelphiX

DXInput

Оформил: XVeL
Автор: Daddy
WEB-сайт: http://daddy.mirgames.ru

В этой статье мы рассмотрим методы управления объектами в играх с помощью клавиатуры, мыши и джойстика..
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;
Примечание: Руль можно считать частным случаем джойстика. При этом штурвал - горизонтальная ось (X), педаль газа и педаль тормоза - вертикальная ось (Y).

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DirectX и DelphiX ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:24:56/0.0055689811706543/1