Графика в Delphi - примеры задач на построение графиков, а также компоненты для графики

DXInput

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

Powered WP Ъ скачать delphi, delphi 7, скачать delphi 7, delphi файлы, delphi, компоненты, delphi 2009, delphi программы, delphi бесплатно, delphi скачать, бесплатно работа delphi, delphi создание, delphi строки, программирования delphi, borland delphi, delphi формы