2D Spiel Steuerung| Mehrfache Tastatureingaben mit Space

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    2D Spiel Steuerung| Mehrfache Tastatureingaben mit Space

    Hey,
    ich habe ein kleines 2D Spiel entwickelt und die Steuerung des Spielers funktioniert, jedoch kann ich nicht Space und a(d) gleichzeitig drücken um nach links / rechts zu springen.

    VB.NET-Quellcode

    1. Private Sub Form_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
    2. Select Case e.KeyData
    3. Case Keys.A
    4. Player.left()
    5. Case Keys.D
    6. Player.right()
    7. Case Keys.Space
    8. Player.jump()
    9. Case Keys.Space AndAlso Keys.D 'Funktioniert nicht
    10. Player.jump()
    11. Player.right()
    12. Case Keys.Space AndAlso Keys.A 'Funktioniert nicht
    13. Player.jump()
    14. Player.left()
    15. End Select
    16. End Sub


    Was muss ich verändern das ich mit Space und d nach rechts springen kann?

    Vielen Dank für eure Antworten :)
    Hi,

    soweit ich weiß, kann man im KeyDown-Event nur Kombinationen von Shift, STRG und Alt abfragen. Nagel mich hier nicht fest, aber ich meine, dass mal irgendwo aufgeschnappt zu haben. Man kann sich jedoch Abhilfe schaffen. Windows bietet die Funktion GetAsyncKeyState, welche systemweit den Zustand jedes Keys zurückgibt.

    Ich hab Dir mal dürftig was geschrieben. Ist jedoch in C#. Falls Du das nutzen möchtest und eine Übersetzung nach VB brauchst, lass mich das wissen.

    C#-Quellcode

    1. public class KeyManager
    2. {
    3. [DllImport("user32.dll")]
    4. static extern ushort GetAsyncKeyState(int vKey);
    5. private List<Keys> _keys = new List<Keys>();
    6. public List<Keys> PressedKeys { get; set; } = new List<Keys>();
    7. public KeyManager()
    8. {
    9. foreach (Keys x in Enum.GetValues(typeof(Keys)))
    10. {
    11. _keys.Add(x);
    12. }
    13. }
    14. public void EvaluateKeys()
    15. {
    16. foreach (Keys x in _keys)
    17. {
    18. ushort result = GetAsyncKeyState((int)x);
    19. if (result != 0 && !this.PressedKeys.Contains(x)) this.PressedKeys.Add(x);
    20. if (result == 0 && this.PressedKeys.Contains(x)) this.PressedKeys.Remove(x);
    21. }
    22. }
    23. }


    C#-Quellcode

    1. class Program
    2. {
    3. static void Main(string[] args)
    4. {
    5. KeyManager _keyManager = new KeyManager();
    6. while (true)
    7. {
    8. _keyManager.EvaluateKeys();
    9. foreach (Keys x in _keyManager.PressedKeys)
    10. {
    11. Console.WriteLine(x.ToString());
    12. }
    13. }
    14. }
    15. }


    In jedem Game-Tick rufst Du EvaluteKeys auf und reagierst entsprechend. Die Liste PressedKeys beinhaltet jede Taste, die in dem Moment gedrückt ist. Wie gesagt, man kann das noch verschönern, sollte auch nur eine Anregung sein.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „SpaceyX“ ()

    zunächst mal solltest du Option Strict On schalten, damit die verknüpfung inkompatibler Datentypen dir auch als Fehler angezeigt wird.
    etwa

    VB.NET-Quellcode

    1. Case Keys.Space AndAlso Keys.D
    darf garnet kompilieren.
    Visual Studio - Empfohlene Einstellungen

    Ansonsten kann man mit dem KeyDown-Event immer nur aufs Niederdrücken einer Taste reagieren.
    Ausnahme bilden die Modifier-Tasten: Alt, Ctr, Shift und deren Kombinationen.

    Einziger Behelf wäre ein DllImport der Windows-API-Funktion GetAsyncKeyState().
    Damit könntest du, wenn Space gedrückt wird, aberufen, ob d zusätzlich gedrückt ist und umgekehrt.
    Das Arbeiten mit DllImporten ist aber ein Spezial-Vorgehen, was ich vb.net-Einsteigern nicht empfehlen würde.
    Einsteiger sollten sich darauf konzentrieren, die Framework-Funktionen kennenzulernen, sowie deren Build-In-Dokumentations-System.
    Für DllImportierte Methoden hingegen muss man sich iwas aussm INet zusammensuchen, eine systematische Doku mir Referenz-Charakter ist mir da nicht bekannt.

    Aber wenn du drauf bestehst, gibts hier ein Tut, in dessen BeispielCode mit der GetAsyncKeyState()-WinApi-Methode gearbeitet wird: KeyDownTester und GetAsyncKeyState()

    Aber ich wiederhole: Wichtiger für dich ist erstmal, Visual Studio - Empfohlene Einstellungen, damit du dir überhaupt ein Verständnis von vb.net als moderne typisierte Programmiersprache erwerben kannst.



    ups - zu spät - man liefert dir bereits c#-Snippets mit GetAsynKeyState.
    (Hihi - wird dich als Einsteiger wohl ebenso überfordern wie das von mir verlinkte vb.net-KeydownTester-Tut.)