Xbox-Controller auslesen

    • VB.NET
    • .NET (FX) 4.5–4.8

    Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von Parmaster.

      @Higlav

      ich muss jetzt doch nochmal nachfragen, da ich Problem hab, und nicht auf die Lösung komme.

      Also ich hab folgenden Code (für LStick und Buttons z.B.), aber es tut sich nichts.

      LStick:

      VB.NET-Quellcode

      1. ​Private Sub LSChanged(sender As Object, e As Controller.StickChangedEventArgs) Handles Control.LeftStickChanged
      2. If e.Direction.HasFlag(Controller.StickDirection.Right) Then
      3. ' tu was
      4. Else
      5. ' tu was anderes
      6. End If
      7. If e.Direction.HasFlag(Controller.StickDirection.Left) Then
      8. ' tu was
      9. Else
      10. ' tu was
      11. End If
      12. End Sub


      Buttons:

      VB.NET-Quellcode

      1. Private Btns As Controller.Buttons
      2. Private Sub BtnReleased(sender As Object, e As Controller.ButtonChangeEventArgs) Handles Control.ButtonReleased
      3. Btns = DirectCast(Btns - (Btns And e.ChangedButtons), Controller.Buttons)
      4. If Btns.HasFlag(Controller.Buttons.A) Then
      5. ' tu was
      6. End If
      7. End Sub


      Hab ich irgendwas vergessen? Oder stimmt es grundsätzlich nicht?

      Über deine Hilfe wäre ich dankbar.
      Hallo Parmaster,

      Also deinen Code für den LeftStick habe ich mal testweise übernommen und probiert - der scheint in Ordnung zu sein. Habe ihn etwas modifiziert, aber der Grundaufbau bleibt der gleiche:

      VB.NET-Quellcode

      1. Private Sub LSChanged(sender As Object, e As Controller.StickChangedEventArgs) Handles Control.LeftStickChanged
      2. If e.Direction.HasFlag(Controller.StickDirection.Right) Then
      3. Console.WriteLine("Right")
      4. Else
      5. 'Else-Statements sind hier eigentlich redundant...
      6. Console.WriteLine("Not Right")
      7. End If
      8. If e.Direction.HasFlag(Controller.StickDirection.Left) Then
      9. Console.WriteLine("Left")
      10. Else
      11. Console.WriteLine("Not Left")
      12. End If
      13. End Sub


      Was das mit den Buttons betrifft:

      Parmaster schrieb:

      Buttons:

      VB.NET-Quellcode

      1. ​Private Btns As Controller.Buttons
      2. Private Sub BtnReleased(sender As Object, e As Controller.ButtonChangeEventArgs) Handles Control.ButtonReleased
      3. Btns = DirectCast(Btns - (Btns And e.ChangedButtons), Controller.Buttons)
      4. If Btns.HasFlag(Controller.Buttons.A) Then
      5. ' tu was
      6. End If
      7. End Sub


      Hab ich irgendwas vergessen? Oder stimmt es grundsätzlich nicht?


      Du musst Zeile 4 ändern von Btns.HasFlag zu e.ChangedButtons.HasFlag, da beim Loslassen des Buttons dieser ja nicht mehr gedrückt wird, weshalb eine Abfrage diesbezüglich natürlich fehlschlägt. Nach der Änderung funktionierte es wieder bei mir.

      Grüsse,

      Higlav
      Hallo!

      Ah, jetzt geht es! :)

      Durch die Änderung der Buttons, geht rein logisch gesehen (also für meine Anwendung) auch der LStick/RStick, da der Start Button bei mir Motoren auf On stellt.

      Eine Frage hätte ich allerdings noch:

      hab zum testen eine MessageBox benutzt, und die kommt nach drücken eines Buttons oder bei Benutzung des Sticks genau 49 mal. An was kann das liegen?

      Parmaster schrieb:

      hab zum testen eine MessageBox benutzt, und die kommt nach drücken eines Buttons oder bei Benutzung des Sticks genau 49 mal. An was kann das liegen?

      Oh, das weiss ich jetzt ehrlich gesagt nicht. Wahrscheinlich staut sich diese Anzahl an Nachrichten im Hintergrund an, während die MessageBoxen aufpoppen. Ich teste immer mit Console.Writeline, womit ich auch einfach die Anzahl Aufrufe überprüfen kann...
      @Higlav

      kann es sein das die Buttons nur einmal abgefragt werden? Oder mache ich hier logisch etwas falsch?

      VB.NET-Quellcode

      1. ​Dim temp As Int32 = 1
      2. If e.ChangedButtons.HasFlag(Controller.Buttons.A) Then
      3. If temp = 1 Then
      4. 'tu was
      5. temp = 2
      6. ElseIf temp = 2 Then
      7. ' mach 1 wieder rückgängig
      8. temp = 1
      9. End If
      10. End If


      Bei mir wird zwar das erste ausgeführt, aber das ElseIf wird nie abgefragt.