Ich mache ein Spiel, und ich habe eine Klasse namens MainCharacter, die zuerst die Hauptfigur (in einer PictureBox) initialisiert und dann hatte ich ein KeyDown-Ereignis für die Behandlung der Bewegung. Innerhalb dieses Ereignisses war ich in der Lage, mit der Bewegung von Charakteren umzugehen, wenn ich die Pfeiltasten drückte, und ich habe sogar eine zeitgesteuerte Animation der Bewegung gemacht, um sie glatter erscheinen zu lassen.Verarbeitung Taste drückt in C#
Das Problem mit dem KeyDown-Ereignis besteht jedoch darin, dass es jedes Mal ausgelöst wird, wenn ich die Taste drücke. Wenn ich also die Pfeiltaste gedrückt halte, wird das Ereignis wiederholt ausgelöst. Das bedeutet, dass der Charakter wie ein Torpedo über den Bildschirm läuft, da das Ereignis so schnell abgefeuert wird, wie es der Computer beherrscht.
Deshalb entschied ich mich, das KeyPress-Ereignis zu verwenden, so dass, wenn ich die Taste gedrückt hielt, der Charakter mit einer gleichmäßigen Geschwindigkeit in der angegebenen Richtung bewegt würde. Das KeyPress-Ereignis kann jedoch keine Pfeiltasten verarbeiten, weshalb ich die ProcessDialogKey-Methode im Hauptformular überschreiben musste. Aber wenn ich es in der Hauptform überschreibe, dann wird das Ereignis jedes Mal ausgelöst, wenn ich die Pfeiltaste drücke, auch wenn ich nicht im Spiel bin, aber zum Beispiel im Hauptmenü oder irgendwo anders. Nebenbei, ich denke, das wäre eine schlechte Übung, wenn ich versuchen würde, die Dinge so oft durch Cross-Klassen zu programmieren.
Also gibt es eine andere Möglichkeit für mich, das KeyPress-Ereignis auf Pfeilen innerhalb meiner MainCharacter-Klasse zu behandeln, ohne andere Klassen zu beeinflussen? Oder gibt es eine Chance für mich, bei dem KeyDown-Event, an dem ich bereits gearbeitet habe, zu bleiben und es so zu machen, dass es nicht wiederholt auslösen kann, wenn ich den Schlüssel gedrückt halte? Denken Sie daran, was ich erreichen möchte ist, dass sich mein Charakter fließend bewegt, wenn ich meinen Schlüssel halte. Bis jetzt funktioniert es gut, wenn ich es nur einmal drücke, aber normalerweise halten Leute die Tasten gedrückt, wenn sie in eine Richtung gehen.
Aber dann wäre die Update-Methode in einer Endlosschleife und würde die ganze Zeit invalidieren, oder? Wie sonst würde ich es so machen, dass die Position ständig nach Richtungsparameter geändert würde? – NoelAramis
Ich weiß nicht, was Sie mit einer Endlosschleife meinen ... Ich dachte, alle Update-Funktionen sind in einer Endlosschleife? – Greg
Ja, das habe ich jetzt gemacht, und der Charakter bewegt sich, wenn ich die Taste drücke und genau dann aufhebe, wenn ich die Taste drücke. Da ich jedoch eine bewegte Animation habe, verschiebt sich der Charakter Pixel für Pixel alle 30 oder also Millisekunden, ich möchte es so machen, dass, wenn ich nur kurz auf die Taste tippe, der Charakter für mindestens 15 Pixel zur Seite bewegt wird, nicht nur für 1 Pixel, weil das nicht einmal auffällt. Ich habe versucht, eine if-Klausel einzufügen, falls die Zeit zwischen den Ereignissen kleiner als 120 ms ist, aber ich habe es nicht wirklich geschafft, es richtig zu machen. – NoelAramis