![]() |
Problem mit DirectInput und ForceFeedback
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!
Habe zu Ostern ein GamePad von SpeedLink geschenkt bekommen. Jetzt versuche ich mit DirectInput ein Programm zu schreiben mit dem ich dieses GamePad abfragen kann. Ich verwende Delphi 7 Pe und die DirectX9-Header von Clootie ( ![]() Knöpfe und Achsen sowie Mehrwegschalter kann ich inzwischen abfragen. Aber ich habe große Probleme mit den ForceFeedback-Effekten. Also, das GamePad hat zwei eingebaute Vibrations-Motoren. Der Linke dreht sich etwas langsamer und hat eine größere Masse als der Rechte. Es gelinkt mir aber immer nur den linken Motor einzuschalten, der rechte reagiert einfach nicht. Auch gelinkt es mir nicht beide Motoren gleichzeitig laufen zu lassen. Hier etwas Code:
Delphi-Quellcode:
Also, wenn ich diese Procedure aufrufe werden alle 3 Effekte ohne Fehlermeldung erzeugt.
procedure TForm1.ConstButton1Click(Sender: TObject);
Const Axes: Array[0..1] of LongWord = (DIJOFS_X, DIJOFS_Y); Direction: Array[0..1] of LongInt = (0, 0); Var Effect: DIEFFECT; ConstantForce: DICONSTANTFORCE; HR: HResult; begin // Alle alten Effekte freigeben FreeEffects; ConstantForce.lMagnitude:=DI_FFNOMINALMAX;; FillChar(Effect, SizeOf(Effect), 0); Effect.dwSize:=SizeOf(DIEFFECT); Effect.dwFlags:=DIEFF_CARTESIAN or DIEFF_OBJECTOFFSETS; Effect.dwDuration:=cEffectSeconds; // 4 Seconds Effect.dwSamplePeriod:=0; Effect.dwGain:=DI_FFNOMINALMAX; Effect.dwTriggerButton:=DIEB_NOTRIGGER; Effect.dwTriggerRepeatInterval:=0; Effect.cAxes:=1; Effect.rgdwAxes:=@Axes[0]; Effect.rglDirection:=@Direction; Effect.lpEnvelope:=Nil; Effect.cbTypeSpecificParams:=SizeOf(DICONSTANTFORCE); Effect.lpvTypeSpecificParams:=@ConstantForce; Effect.dwStartDelay:=0; // Hier wird ein Effekt für die X-Achse erzeugt (funktioniert) // X-Axis HR:=PIController.CreateEffect(GUID_ConstantForce, @Effect, PIEffects[0], Nil); If Failed(HR) Then ErrorBox(HR, 'ConstButton1Click', 'The effect 0 could not be created!'); // Hier wird ein Effekt für die Y-Achse erzeugt (funktioniert NICHT :x) // Y-Axis Effect.rgdwAxes:=@Axes[1]; HR:=PIController.CreateEffect(GUID_ConstantForce, @Effect, PIEffects[2], Nil); If Failed(HR) Then ErrorBox(HR, 'ConstButton1Click', 'The effect 2 could not be created!'); // Hier wird ein Effekt für beide Achsen erzeugt (Aber nur der linke Motor reagiert :evil:) // X- and Y-Axes Effect.cAxes:=2; Effect.rgdwAxes:=@Axes; Effect.dwFlags:=DIEFF_POLAR or DIEFF_OBJECTOFFSETS; HR:=PIController.CreateEffect(GUID_ConstantForce, @Effect, PIEffects[1], Nil); If Failed(HR) Then ErrorBox(HR, 'ConstButton1Click', 'The effect 1 could not be created!'); end; Auch kann ich alle drei Effekte ohne Fehlermeldung starten, aber was auch immer ich versuche es reagiert stets nur der linke Motor?!?! Es spielt scheinbar auch keine Rolle was ich im Array Direction für Werte angebe- das GamePad scheint dies einfach zu ignorieren. Ich dachte dass ich über das Array Axes festlegen kann welcher Motor angesprochen wird. Ich bin für jeden Tipp Dankbar denn ich weiß im Moment wirklich nicht wo der Fehler liegen könnte. Übrigens: Wenn ich in der Systemsteuerung auf GamePad gehe dort gibt es eine Seite "Vibration Page". Dort kann ich BEIDE Motoren unabhängig voneinander und auch gleichzeitig laufen lassen- es muss also irgendwie funktionieren. Grüße von TOC! Im Anhang ein Zip mit dem gesamten Programm zur Abfrage des GamePad (Source und Exe). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz