DXInput
В этой статье мы рассмотрим методы управления объектами в играх с помощью клавиатуры, мыши и джойстика..
1. Клавиатура.
Опрос нажатия клавиши ведется через .States:
begin
//действие
end
,где <тикер> есть зарезервированное слово: isUp - по умолчанию "стрелка вверх" isDown - по умолчанию "стрелка вниз" isRight - по умолчанию "стрелка вправо" isLeft - по умолчанию "стрелка влево"IsButton1 - по умолчанию "Space" IsButton2 - по умолчанию "Enter" IsButton3-IsButton32 - по умолчанию не определеныДля сравнения два равноценных условия:
//c использования
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 (ssAlt in Shift) then ...
If (ssShift in Shift) then ...
Небольшой примерчик. Зарекрепим за тикером isUp - кнопки "E","I" и "стрелка вверх":
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 - положение курсора по третьей осиНебольшой примерчик:
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 - используется в случае наличия на джойстике соответствующей ручки.Этот кусок кода сканирует кнопки на джойстике:
begin
if 1.Joystick.Buttons[i] = True then
begin
//Кнопка нажата. Действие.
end;
end;
Примечание: Руль можно считать частным случаем джойстика. При этом штурвал - горизонтальная ось (X), педаль газа и педаль тормоза - вертикальная ось (Y).
http://www.mirgames.ru
Отправить комментарий