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 (
http://www.clootie.ru/delphi/download_dx92.html).
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:
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;
Also, wenn ich diese Procedure aufrufe werden alle 3 Effekte ohne Fehlermeldung erzeugt.
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).