KeyDown Problem

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    KeyDown Problem

    Hallo,

    ich habe ein Problem mit dem KeyDown-Event.
    Ich habe es folgendermaßen, es ist leider etwas schwerer zu erklären:

    Ich habe ein kleines Spiel in GDI, wo man mit W springen, mit A und D gehen kann.
    Um zwei Tasten gleichzeitig drücken zu können, habe ich 3 Boolean Variablen (für jede Taste halt eine) erstellt.

    Denen weise ich dann im KeyDown-Event einen Wert zu: (hier der Taste W)

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.W Then
    2. 'Code
    3. KeyW = True
    4. End If


    Im KeyUp-Event weise ich dann den jeweiligen Tasten wieder den "False" Wert zu.
    Dann frage ich im Timer ab:

    VB.NET-Quellcode

    1. If KeyW = True And KeyD = True Then
    2. 'Code
    3. End If


    Nun, dass funktioniert alles. Nur, wenn meine Person dann eben springt und er wieder aufkommt, und ich nur noch D gedrückt habe, bleibt er trotzdem stehen. (obwohl natürlich in der Variable noch KeyD = True steht)
    Das Problem ist halt nun, dass ich die Taste wieder loslassen und wieder draufdrücken muss, um weiterlaufen zu können.

    Ich hoffe ich habe mein Problem einigermaßen gut erklärt und ich bedanke mich jetzt schon mal für die Antworten.
    Oliver
    Mach nicht 3 Variablen für die disjunkten Zustände, mach Dir ein Enum mit allen möglichen Zuständen.
    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!

    Artentus schrieb:

    und Bitoperationen durchführen.
    Eben nicht.
    rückwärts springen und vorwärts pfeifen geht nicht gleichzeitig.
    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!
    Ein kleines Beispiel:
    Ich garantiere nicht, dass es funktioniert! Ist nicht ausprobiert!

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. If Laufen_R = True Then
    3. Figur_x += 1
    4. End If
    5. If Laufen_L = True Then
    6. Figur_x -= 1
    7. End If
    8. If Springen = True Then
    9. If Springzähler = 20 Then
    10. Figur_y += 10
    11. Springzähler -= 1
    12. Else
    13. Figur_y -= 10
    14. Springzähler += 1
    15. End If
    16. If Springzähler = 0 Then
    17. Springen = False
    18. End If
    19. End If
    20. End Sub

    Artentus schrieb:

    Frage im KeyUp genauso wie im KeyDown ab.

    Das mache ich bereits. (hatte nicht extra nochmal ein VB-Code gepostet)

    Mit Enums habe ich leider noch nie wirklich Bekanntschaft gemacht, wie würde dass denn in etwa funktionieren?

    Ansonsten könnte ich es doch auch so machen, nur wäre die Lösung etwas unschöner: (da Timer und nicht Event?)

    KeyDown-Event:

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.D Then
    2. KeyD = True
    3. End If


    KeyUp-Event:

    VB.NET-Quellcode

    1. If e.KeyCode = Keys.D Then
    2. KeyD = False
    3. End If


    Timer:

    VB.NET-Quellcode

    1. If KeyD = True Then
    2. 'Code
    3. End If


    Danke jedenfalls für die vielen Antworten bis jetzt! :)

    Oliv3r schrieb:

    Mit Enums habe ich leider noch nie wirklich Bekanntschaft gemacht, wie würde dass denn in etwa funktionieren?
    Etwa so:
    Enum

    VB.NET-Quellcode

    1. Public Enum AlleMeineZustaende
    2. Zustand1
    3. Zustand2
    4. Zustand3
    5. Zustand4
    6. End Enum
    7. Public MyAlleMeineZustaende As AlleMeineZustaende = AlleMeineZustaende.Zustand1
    8. Private Sub xxx()
    9. Select Case MyAlleMeineZustaende
    10. Case AlleMeineZustaende.Zustand1
    11. ' Tue dies
    12. Case AlleMeineZustaende.Zustand2
    13. ' Tue dies
    14. Case AlleMeineZustaende.Zustand3
    15. ' Tue dies
    16. Case AlleMeineZustaende.Zustand4
    17. ' Tue dies
    18. End Select
    19. End Sub
    20. Private Sub yyy()
    21. If Key.A And Not irgendwas
    22. MyAlleMeineZustaende = AlleMeineZustaende.Zustand4
    23. End If
    24. End Sub
    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!