Taste gedrückt halten


  • Administrator

    D.J. schrieb:

    In C++ ging das viel leichter; einfach mit _getch() + switch.

    Kleiner Hinweis: _getch() ist nicht Standrad C++ 😉

    Und noch ein weiterer Hinweise an alle im Thread:
    WinForms hat schon die Funktionalität für Key-Repeat drin. Heisst wenn man eine Taste gedrückt hält, werden entsprechend den Einstellungen in Windows das KeyDown -Event wiederholt aufgerufen.

    Bezogen auf den ersten Beitrag:

    D.J. schrieb:

    Ich habe schon viel im Internet rechachiert aber ich bekomms einfach nicht hin.

    Was meinst du damit, dass du es nicht hinbekommst? Was passiert denn? Verschwindet womöglich der Spieler auf der Stelle, weil so viele KeyDown Events innert so kurzer Zeit ausgelöst werden, dass der Spieler in Nullkommanichts ganz wo anders steht?

    Grüssli



  • Vielen Dank!
    Jetzt funktioniert das



  • Was meinst du damit, dass du es nicht hinbekommst? Was passiert denn? Verschwindet womöglich der Spieler auf der Stelle, weil so viele KeyDown Events innert so kurzer Zeit ausgelöst werden, dass der Spieler in Nullkommanichts ganz wo anders steht?

    Nein. Allgemein hat sich mein Spieler einfach nicht bewegt.



  • Hm. Hab doch noch ein kleines Problem.

    Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.


  • Administrator

    D.J. schrieb:

    Was meinst du damit, dass du es nicht hinbekommst? Was passiert denn? Verschwindet womöglich der Spieler auf der Stelle, weil so viele KeyDown Events innert so kurzer Zeit ausgelöst werden, dass der Spieler in Nullkommanichts ganz wo anders steht?

    Nein. Allgemein hat sich mein Spieler einfach nicht bewegt.

    Hast du vergessen ein Invalidate aufzurufen, damit das OnPaint Event erneut versendet wird?

    Grüssli



  • Hast du vergessen ein Invalidate aufzurufen, damit das OnPaint Event erneut versendet wird?

    Nein. Ich wusste einfach nicht wirklich wie das in C# funktionier, das man einen Tastendruck einliest und auswertet. Hab das nur so halbrichtig gemacht indem ich mri google als HIlfestellung genommen habe.

    Aber jetzt funktionierts ja.
    Bis auf das Oben genannte Problem eben.

    Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.


  • Administrator

    Wie hast du es denn jetzt gelöst? Mit der Variante von geeky oder meiner? Kannst du das Problem reproduzieren in einem einfachen Projekt (weniger als 100 Zeilen ;))?

    Grüssli



  • So habe ich das jetzt gelöst.. Warum fragst du so dringlich? 😉

    private List<Keys> _pressedKeys = new List<Keys>();
    
     private void Map_KeyDown(object sender, KeyEventArgs e)
            {
                _pressedKeys.Add(e.KeyData);
            }
    
            private void Map_KeyUp(object sender, KeyEventArgs e)
            {
                _pressedKeys.Clear();
            }
    
            private void SpielerTimer_Tick(object sender, EventArgs e)
            {
                // Bewegungen Abhängig von Keys
    
                    if (_pressedKeys.Contains(Keys.W))
                    {
                        SpielerY -= 10;
                        Spieler.Location = new Point(SpielerX, SpielerY);
                    }
    
                    if (_pressedKeys.Contains(Keys.S))
                    {
                        SpielerY += 10;
                        Spieler.Location = new Point(SpielerX, SpielerY);
                    }
    
                    if (_pressedKeys.Contains(Keys.A))
                    {
                        SpielerX -= 10;
                        Spieler.Location = new Point(SpielerX, SpielerY);
                    }
    
                    if (_pressedKeys.Contains(Keys.D))
                    {
                        SpielerX += 10;
                        Spieler.Location = new Point(SpielerX, SpielerY);
                    }           
            }
    


  • Wenn ich die Taste jetzt etwas länger gedrückt halte, dann hört der Spieler nicht mehr auf sie fortzubewegen.

    Ist das nicht der Sinn darin? Also die Figur so lange bewegen wie die Taste gedrückt ist wird.

    Hast du den Code den du da verwendest überhaupt komplett verstanden? Wenn ja dann findest du das Problem schon noch selber.



  • if(!pressedKeys.Contains(e.KeyData))
       _pressedKeys.Add(e.KeyData);
    


  • Ich habs ja schon gelöst.

    private void Map_KeyUp(object sender, KeyEventArgs e)
            {
                _pressedKeys.Clear();
            }
    

    War früher:

    private void Form1_KeyUp(object sender, KeyEventArgs e)
    {
        _pressedKeys.Remove(e.KeyData);
    }
    

    Und jetzt funktionierts.
    Danke 🙂



  • Bedeutet aber auch, dass Du nur jeweils eine Taste zuverlässig nutzen kannst. Nix mit gleichzeitig laufen _und_ springen.

    Denn beim Loslassen einer Taste löschst Du auch die Information über alle anderen gedrückten Tasten. Verwende lieber die OnKeyDown()-Variante von Jesus Christus (das ist ein Nick, oder?).



  • Genau, wenn Clear benutzt wird bedeutet das dass die Taste "D" auch gelöscht wird wenn man zwischendurch springt.

    Wenn "Map_KeyDown" bei gedrückt gehaltener Taste mehrfach aufgerufen wird, dann musst du es so lösen wie Jesus Christus es schrieb, wenn nur einmal reicht auch meine Variante. Sorg einfach dafür das eine Taste nur einmal in der Liste vorkommt.

    So oder so, beim KeyUp darfst du nur die Taste löschen die auch los gelassen wurde.


Anmelden zum Antworten