Direct Input (Gamepad) Rechter AnalogStick Hoch Runter geht irgendwie nicht

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von jvbsl.

    Direct Input (Gamepad) Rechter AnalogStick Hoch Runter geht irgendwie nicht

    Ich versuche eine mit DirectX eine USB-Gamepad abfrage zu schreiben,
    das Programm Funktioniert soweit, außer wenn ich den rechten analogstick
    nach oben oder unten bewege passiert nichts.

    Ich weiß das die Achsen X und Y für den Linken Analogstick stehen,
    die Z und ZR für den Rechten Stick, Die ZR-Achse (Rechter Stick Links/Rechts)
    gibt werte zurück, die Z-Achse (Rechter Stick Hoch/Runter) leider nicht.
    Hat jemand eine Ahnung wo der Fehler ist?

    Quellcode

    1. Imports Microsoft.DirectX.DirectInput
    2. Imports Microsoft.DirectX
    3. Imports Gamepad.Form1
    4. Public Class Form1
    5. Private Plekker As Gamepad
    6. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Try : Plekker = New Gamepad(Me.Handle, -1000, 1000, -1000, 1000)
    8. Catch ex As Exception
    9. MsgBox(ex.Message)
    10. End Try
    11. End Sub
    12. Public Structure Buttons
    13. Dim K0 As Boolean
    14. Dim K1 As Boolean
    15. Dim K2 As Boolean
    16. Dim K3 As Boolean
    17. Dim K4 As Boolean
    18. Dim K5 As Boolean
    19. Dim K6 As Boolean
    20. Dim K7 As Boolean
    21. Dim K8 As Boolean
    22. Dim K9 As Boolean
    23. Dim K10 As Boolean
    24. Dim K11 As Boolean
    25. End Structure
    26. Public Structure Status
    27. Dim X_Achse As Integer
    28. Dim Y_Achse As Integer
    29. Dim Z_Achse As Integer
    30. Dim RZ_Achse As Integer
    31. Dim Knopf As Buttons
    32. End Structure
    33. Private Sub Poller_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Poller.Tick
    34. Try : Plekker.Pollen()
    35. Label1.Text = "X= " & Plekker.StatusStand.X_Achse.ToString
    36. Label2.Text = "Y= " & Plekker.StatusStand.Y_Achse.ToString
    37. Label3.Text = "RZ= " & Plekker.StatusStand.RZ_Achse.ToString
    38. Label4.Text = "Z= " & Plekker.StatusStand.Z_Achse.ToString
    39. If (Plekker.StatusStand.Knopf.K0 = True) Then
    40. C1.Checked = True
    41. Else : C1.Checked = False
    42. End If
    43. If (Plekker.StatusStand.Knopf.K1 = True) Then
    44. C2.Checked = True
    45. Else : C2.Checked = False
    46. End If
    47. If (Plekker.StatusStand.Knopf.K2 = True) Then
    48. C3.Checked = True
    49. Else : C3.Checked = False
    50. End If
    51. If (Plekker.StatusStand.Knopf.K3 = True) Then
    52. C4.Checked = True
    53. Else : C4.Checked = False
    54. End If
    55. If (Plekker.StatusStand.Knopf.K4 = True) Then
    56. C5.Checked = True
    57. Else : C5.Checked = False
    58. End If
    59. If (Plekker.StatusStand.Knopf.K5 = True) Then
    60. C6.Checked = True
    61. Else : C6.Checked = False
    62. End If
    63. If (Plekker.StatusStand.Knopf.K6 = True) Then
    64. C7.Checked = True
    65. Else : C7.Checked = False
    66. End If
    67. If (Plekker.StatusStand.Knopf.K7 = True) Then
    68. C8.Checked = True
    69. Else : C8.Checked = False
    70. End If
    71. If (Plekker.StatusStand.Knopf.K8 = True) Then
    72. C9.Checked = True
    73. Else : C9.Checked = False
    74. End If
    75. If (Plekker.StatusStand.Knopf.K9 = True) Then
    76. C10.Checked = True
    77. Else : C10.Checked = False
    78. End If
    79. If (Plekker.StatusStand.Knopf.K10 = True) Then
    80. C11.Checked = True
    81. Else : C11.Checked = False
    82. End If
    83. If (Plekker.StatusStand.Knopf.K11 = True) Then
    84. C12.Checked = True
    85. Else : C12.Checked = False
    86. End If
    87. Catch ex As Exception
    88. If MsgBox("Fehler beim Pollen", MsgBoxStyle.Critical) = MsgBoxResult.Ok Then
    89. Me.Close()
    90. End If : End Try
    91. End Sub
    92. End Class
    93. Public Class Gamepad
    94. Private Plekker_Status As Status
    95. Private Plekker_Instance As DeviceInstance
    96. Private Mein_Plekker As Device = Nothing
    97. Private Pad As JoystickState
    98. Public Sub New(ByVal hwnd As System.IntPtr, ByVal rangeMin As Integer, ByVal rangeMax As Integer, ByVal rangeMinZ As Integer, ByVal rangeMaxZ As Integer)
    99. Pad = New JoystickState()
    100. For Each Me.Plekker_Instance In Manager.GetDevices(DeviceClass.GameControl, EnumDevicesFlags.AttachedOnly)
    101. Mein_Plekker = New Device(Plekker_Instance.InstanceGuid)
    102. Exit For
    103. Next Plekker_Instance
    104. Mein_Plekker.SetDataFormat(DeviceDataFormat.Joystick)
    105. Mein_Plekker.SetCooperativeLevel(hwnd, CooperativeLevelFlags.Exclusive Or CooperativeLevelFlags.Foreground)
    106. Dim DOI As DeviceObjectInstance
    107. For Each DOI In Mein_Plekker.Objects
    108. If 0 <> (DOI.ObjectId And CInt(DeviceObjectTypeFlags.Axis)) Then
    109. Mein_Plekker.Properties.SetRange(ParameterHow.ById, DOI.ObjectId, New InputRange(rangeMin, rangeMax))
    110. If (DOI.Name Like "Z-Achse") Then
    111. Mein_Plekker.Properties.SetRange(ParameterHow.ById, DOI.ObjectId, New InputRange(rangeMinZ, rangeMaxZ))
    112. End If : End If
    113. Next DOI
    114. End Sub
    115. Public ReadOnly Property StatusStand As Status
    116. Get
    117. Return Plekker_Status
    118. End Get
    119. End Property
    120. Public Sub Pollen()
    121. Try : Mein_Plekker.Poll()
    122. Catch InpLose As InputException
    123. If TypeOf InpLose Is NotAcquiredException Or TypeOf InpLose Is InputLostException Then
    124. Try : Mein_Plekker.Acquire()
    125. Catch
    126. Return
    127. End Try : End If : End Try
    128. Try : Pad = Mein_Plekker.CurrentJoystickState
    129. Catch
    130. Return
    131. End Try
    132. With Plekker_Status
    133. .X_Achse = Pad.X
    134. .Y_Achse = Pad.Y
    135. .Z_Achse = Pad.Z
    136. .RZ_Achse = Pad.Rz
    137. .Knopf.K0 = Stand(Pad.GetButtons.ElementAt(0))
    138. .Knopf.K1 = Stand(Pad.GetButtons.ElementAt(1))
    139. .Knopf.K2 = Stand(Pad.GetButtons.ElementAt(2))
    140. .Knopf.K3 = Stand(Pad.GetButtons.ElementAt(3))
    141. .Knopf.K4 = Stand(Pad.GetButtons.ElementAt(4))
    142. .Knopf.K5 = Stand(Pad.GetButtons.ElementAt(5))
    143. .Knopf.K6 = Stand(Pad.GetButtons.ElementAt(6))
    144. .Knopf.K7 = Stand(Pad.GetButtons.ElementAt(7))
    145. .Knopf.K8 = Stand(Pad.GetButtons.ElementAt(8))
    146. .Knopf.K9 = Stand(Pad.GetButtons.ElementAt(9))
    147. .Knopf.K10 = Stand(Pad.GetButtons.ElementAt(10))
    148. .Knopf.K11 = Stand(Pad.GetButtons.ElementAt(11))
    149. End With
    150. End Sub
    151. Private Function Stand(ByVal Gedrueckt As Byte) As Boolean
    152. If (Gedrueckt > 0) Then
    153. Return True
    154. Else
    155. Return False
    156. End If
    157. End Function
    158. End Class


    Hier die ProjektMappeGamepad.7z

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Willkommen im Forum. :thumbup:

    Derfuhr schrieb:

    VB.NET-Quellcode

    1. If (Plekker.StatusStand.Knopf.K0 = True) Then
    2. C1.Checked = True
    3. Else : C1.Checked = False
    4. End If
    1. würde ich die Benennungen synchronisieren: K0 <=> C0 usw.,
    2. kannst Du das so schreiben:

    VB.NET-Quellcode

    1. C1.Checked = Plekker.StatusStand.Knopf.K0

    3. da das Bits sin, die Du ausgibst, ist die Ausgabe im Hex-Format sachdienlicher:

    VB.NET-Quellcode

    1. Label1.Text = "X= " & Plekker.StatusStand.X_Achse.ToString("X2")

    Im Konstruktor von Gamepad hast Du nur 2 Achsen, deren Minima/Maxima Du setzt, wo bleiben die anderen beiden?

    VB.NET-Quellcode

    1. Mein_Plekker = New Device(Plekker_Instance.InstanceGuid)
    2. Exit For
    Wie oft wird das denn aufgerufen?
    Du hast aber nur genau 1 Instanz, obwohl Du ggf. mehrere bräuchtest :?: :?: :?:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    :thumbup: Erst einmal Danke für die Wilkommensgrüße und die schnelle Antwort,
    Deine verbesserungsvorschläge finde ich wirklich gut und habe sie umgesetzt!

    Auch wenn ich nur für 2 Achsen Min/max gesetzt habe bekomme
    ich für die X, Y, und ZR_Achse Werte zwischen -1000/1000 zurück,
    Für die Z_Achse bekomme ich immer eine 0 als Wert.

    Deshalb verstehe ich nicht ganz warum evtl. eine weitere instanz nötig ist?
    Vielleicht für jeden Analogstick eine?

    Könnte es sein das ich mit den Achsen RX,RY arbeiten muss?

    Verzeiht mir bitte, das ich das nicht ganz verstehe, Ich lerne erstseit 5 Monaten,
    bin also noch ein absoluter Rookie! ?( :whistling:

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Derfuhr“ ()

    Derfuhr schrieb:

    Deshalb verstehe ich nicht ganz warum evtl. eine weitere instanz nötig ist?
    Weil das in einer For Each-Schleife aufgerufen wird.
    Wenn Du nur eine Instanz brauchst, brauchst Du keine Schleife.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Habs gelöst!!

    Quellcode

    1. With Plekker_Status
    2. .X_Achse = Pad.X
    3. .Y_Achse = Pad.Y
    4. 'Das ist die entscheidende Zeile
    5. .Z_Achse = (Pad.GetSlider.ElementAt(0) * -1)
    6. 'so kommt ein Wert -1000/1000
    7. .RZ_Achse = Pad.Rz
    8. .Knopf.K0 = Stand(Pad.GetButtons.ElementAt(0))
    9. .Knopf.K1 = Stand(Pad.GetButtons.ElementAt(1))
    10. .Knopf.K2 = Stand(Pad.GetButtons.ElementAt(2))
    11. .Knopf.K3 = Stand(Pad.GetButtons.ElementAt(3))
    12. .Knopf.K4 = Stand(Pad.GetButtons.ElementAt(4))
    13. .Knopf.K5 = Stand(Pad.GetButtons.ElementAt(5))
    14. .Knopf.K6 = Stand(Pad.GetButtons.ElementAt(6))
    15. .Knopf.K7 = Stand(Pad.GetButtons.ElementAt(7))
    16. .Knopf.K8 = Stand(Pad.GetButtons.ElementAt(8))
    17. .Knopf.K9 = Stand(Pad.GetButtons.ElementAt(9))
    18. .Knopf.K10 = Stand(Pad.GetButtons.ElementAt(10))
    19. .Knopf.K11 = Stand(Pad.GetButtons.ElementAt(11))
    20. End With


    die Z_Achse lese ich nun so aus: @plekker status .Z_Achse = (Pad.GetSlider.ElementAt(0) * -1) :D


    Funtionsfähige ProjektMappe: Gamepad.7z

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Derfuhr“ ()

    Seit eine Woche suche ich schon nach einem funktionierenden Code und deiner war es! Vielen Vielen Dank!
    (Gamepad: Logitech Precision G-UG15)

    P.S.: für alle ,die nicht so gut in VB.net sind: Die Projektmappe benötigt Directx SDK. In meinem Fall hat Directx SDK vom August 2007 ausgereicht (nach dxsdk_aug2007.exe googlen).

    microsoft.com/en-us/download/details.aspx?id=13287
    Auch wenn der Beitrag inzwischen uralt ist, aber da du diesen als Lösung für dich gefunden hast, würde ich dir noch gerne sagen, dass MS DirectInput für tot erklärt hat und stattdessen RawInput verwendet werden sollte. Dazu findet man eigt auch viel im Netz. Wenn man WinAPI von c nach .net übersetzen kann ist es besonders einfach.
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---