Zweiter Aufruf klappt nicht

  • VB.NET

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

    Zweiter Aufruf klappt nicht

    Hallo @ all

    Ich programmiere gerade ein SPiel aber da das Problem ehr mit der Logik zusammenhängt schreibe ich es mal hier rein. Ich habe mir folgende Funktion geschrieben:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function GetKeyState(ByVal time As GameTime, ByVal key As Keys) As KeyState
    2. Static Dim oldState As New KeyboardState
    3. Static Dim oldTime As Double
    4. Dim state As New KeyState
    5. If Keyboard.GetState.IsKeyUp(key) Then
    6. state = KeyState.Up
    7. oldTime = time.TotalGameTime.TotalMilliseconds
    8. ElseIf Keyboard.GetState.IsKeyDown(key) AndAlso oldState.IsKeyUp(key) Then
    9. state = KeyState.Down
    10. oldTime = time.TotalGameTime.TotalMilliseconds
    11. ElseIf oldTime + 400 < time.TotalGameTime.TotalMilliseconds Then
    12. state = KeyState.Pressed
    13. Else
    14. state = Nothing
    15. End If
    16. If state.ToString <> "Up" Then
    17. Debug.Print(state.ToString)
    18. End If
    19. oldState = Keyboard.GetState
    20. Return state
    21. End Function


    Diese rufe ich jetzt zweimal hintereinander auf:

    VB.NET-Quellcode

    1. Select GetKeyState(gameTime, Keys.Left)
    2. Case KeyState.Down
    3. cList.RotateLeft()
    4. Case KeyState.Pressed
    5. MsgBox("Pressed")
    6. End Select
    7. Select Case GetKeyState(gameTime, Keys.Right)
    8. Case KeyState.Down
    9. cList.RotateRight()
    10. Case KeyState.Pressed
    11. MsgBox("Pressed")
    12. End Select


    KeyState ist ein ganz normales Enum von mir. Bei dem ersten aufruf klappt das ganze auch noch wunderbar. Beim zweiten (mit der Rechten Taste) funktioniert es nicht mehr. Keine Reaktion - der Rückgabewert ist immer Up. Bei Left geht es weiterhin ohne Probleme (das ganze läuft in einer Endlosschleife). Wenn ich die Abfragen tausche funktioniert immer nur die erste. Woran liegt das?

    Hoffe ihr könnt mir helfen. Viele Grüße
    Croasider
    Ich hab keine Lust zum Raten.
    Was hast Du da für Imports drin?
    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!
    In XNA gibt es keine wirklichen WindowsForm Events. Deswegen muss man die Events selber schreiben und ich möchte zwischen KeyDown und KeyPress unterscheiden können. Deswegen werden die 400 Millisekunden draufgerechnet. Wenn in diesen 400 Millisekunden sich der KeyState = Down nicht ändert hält der User die Taste gedrückt. Wenn sich der Keystate ändert dann hat er sie wieder losgelassen und eventl. nochmal neu gedrückt.
    Irgendwie ist das Quark was du da machst. Du schreibst dir einen Sub, der in der Updateschleife gerufen wird, und dort fragst du deine KeyEvents ab, dort änderst du dann auch die Positionen von Objekten oder was auch immer du machen willst. Hält der User gedrückt ist halt die Taste nach 16ms immer noch KeyState.Up oder sonstiges.
    Ne du hast es glaube ich falsch verstanden.

    Also aus der Update Funktion rufe ich die Funktion GetKeyState auf. Diese prüft erst ob die Taste gedrückt ist sonst gibt sie KeyUp zurück. Wenn die Taste gedrückt ist und der alte State nicht down war dann ist die Taste neu gedrückt worden und das Down Event löst aus. Wenn die Taste down ist und der alte state auch down ist UND 400 Millisekunden vergangen sind löst das Press Event aus.

    Bei dem ersten Aufruf klappt das auch so wie ich es mir vorstelle. Bei dem zweiten aufruf mit einer anderen Taste klappt es nicht mehr. Was ich dann bei den Events mache ist ja erstmal egal.