Gamecontroller in Lazarus-Programm nutzen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
400kmh
Beiträge: 92
Registriert: Do 25. Mär 2010, 04:03

Gamecontroller in Lazarus-Programm nutzen

Beitrag von 400kmh »

Hallo, ich möchte für ein Programm die Eingaben an einem Gamecontroller nutzen. Der Gamecontroller hat zwei Analog-Sticks. An die Eingabe des linken Sticks komme ich heran, an die Eingabe des rechten Sticks nicht.

Für den linken Stick funktioniert folgender Code:

Code: Alles auswählen

uses mmsystem;

[...]

var

Joyinfo: TJoyinfo;

[...]

joygetpos(joystickid1,@Joyinfo);           
Ausgabe:=FormatFloat('0', Joyinfo.wXpos);
Ausgabe:=FormatFloat('0', Joyinfo.wYpos);
Je nach Haltung des linken Sticks werden Zahlen zwischen 0 und 65535 ausgegeben.

WXpos und wYPos sind vom typ uint. Um die Eingabe des rechten Sticks zu nutzen, habe ich es mit TJoyinfoEx probiert:

Code: Alles auswählen

uses mmsystem;

[...]

var

JoyinfoEx: TJoyinfoEx;

[...]

joygetposEx(joystickid1,@JoyinfoEx);           
Ausgabe:=FormatFloat('0', JoyinfoEx.dwRpos);
Ausgabe:=FormatFloat('0', JoyinfoEx.dwUpos);
Ausgabe:=FormatFloat('0', JoyinfoEx.dwVpos);
DwRPos, dWUPos, dwVPos sind aber immer 0. Sie sind auch nicht vom Typ uint sondern vom Typ DWORD. Angeblich sollen darin aber Achsendaten enthalten sein. Allerdings kann ich auch JoyinfoEx.wxPos vom Typ uint nicht nutzen. Irgendetwas mache ich wohl falsch.

Wie komme ich an die Daten des rechten Sticks heran?

sstvmaster
Beiträge: 437
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.0.12
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von sstvmaster »

Hier gibts ein Beispiel rund um die MMSystem.

https://www.delphipraxis.net/71569-game ... ragen.html
Windows 10, Lazarus 2.0.12 + Lazarus Trunk
LG Maik

400kmh
Beiträge: 92
Registriert: Do 25. Mär 2010, 04:03

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von 400kmh »

Danke, der Code funktioniert bei meinem Gamecontroller einwandfrei.

Allerdings habe ich noch ein 20 Jahre altes Lenkrad, mit dem funktioniert es nicht. Von Windows 10 wird das Lenkrad erkannt, aber mit dem verlinkten Code kann ich mit Lazarus nicht darauf zugreifen. Woran könnte das liegen?

sstvmaster
Beiträge: 437
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.0.12
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von sstvmaster »

Ich würde mal sagen an der DeviceNr?

siehe:

Code: Alles auswählen

constructor TGamepad.Create;
begin
  inherited Create;
  DeviceNr := 0; // <-- andere Nr.?
  Range := 1000;
  DeadZone := 400;
  Calibrate;
end;
Windows 10, Lazarus 2.0.12 + Lazarus Trunk
LG Maik

400kmh
Beiträge: 92
Registriert: Do 25. Mär 2010, 04:03

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von 400kmh »

sstvmaster hat geschrieben:
Di 9. Feb 2021, 21:06
Ich würde mal sagen an der DeviceNr?
Habe von 0 bis 15 alles durchprobiert, aber ändert nichts.

400kmh
Beiträge: 92
Registriert: Do 25. Mär 2010, 04:03

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von 400kmh »

Beim Lenkrad funktioniert nun mein erster Code leicht abgwandelt mit JoyInfo statt JoyInfoEx und joygetpos(joystickid2,@Joyinfo). Das Lenkrad mit 2 Pedalen hat ja auch nur drei Achsen.

Nur das Bremspedal bekomme ich noch nicht. Eigentlich sollte ich seine Stellung doch über Joyinfo.wzpos kriegen. Naja, vielleicht funktionierts wenn man den verlinkten langen Code nimmt, aber ihn auf JoyInfo anpasst.

corpsman
Beiträge: 1192
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus SVN Trunk, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Gamecontroller in Lazarus-Programm nutzen

Beitrag von corpsman »

das ganze schon mal mit SDL probiert ?

Code: Alles auswählen

(******************************************************************************)
(*                                                                            *)
(* SDL Joystick wrapper by Corpsman                                2020.04.21 *)
(*                                                                            *)
(* Version: 0.01                                                              *)
(* History: 0.01 : Initialversion                                             *)
(******************************************************************************)
Unit usdl_joystick;

{$MODE objfpc}{$H+}

Interface

(*
 * Wenn es nicht Compiliert, hift ein
 *
 * sudo aptitude install libsdl2-dev
 *)

Uses
  Classes, SysUtils, sdl2;

Type

  { TSDL_Joystick }

  TSDL_Joystick = Class
  private
    fAxisCount: integer;
    fButtonCount: integer;
    fInstance: Pointer;
    Function GetAxisValue(index: integer): integer;
  public
    Property AxisCount: integer read fAxisCount;
    Property Axis[index: integer]: integer read GetAxisValue; // ranging from -32768 to 32767

    Constructor Create(Index: integer);
    Destructor Destroy; override;
  End;

Implementation

{ TSDL_Joystick }

Function TSDL_Joystick.GetAxisValue(index: integer): integer;
Begin
  result := SDL_JoystickGetAxis(fInstance, index);
End;

Constructor TSDL_Joystick.Create(Index: integer);
Begin
  Inherited create;
  If (SDL_WasInit(SDL_INIT_JOYSTICK) and SDL_INIT_JOYSTICK) = 0 Then Begin
    Raise Exception.create('Error SDL subsystem for joystick is not initialized.');
  End;
  SDL_JoystickEventState(SDL_ENABLE);
  fInstance := SDL_JoystickOpen(Index);
  If Not assigned(fInstance) Then Begin
    Raise Exception.create('Error could not create joystick instance.');
  End;
  fAxisCount := SDL_JoystickNumAxes(fInstance);
  fButtonCount := SDL_JoystickNumButtons(fInstance);
End;

Destructor TSDL_Joystick.Destroy;
Begin
  If assigned(fInstance) Then Begin
    SDL_JoystickClose(fInstance);
    fInstance := Nil;
  End;
End;

End.


--
Just try it

Antworten