2010-11-23 10 views
0

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.

Antwort

0

Erstellen Sie eine direction Variable auf Ihrer MainCharacter Klasse.

OnKeyDown der linken Taste, eingestellte Richtung auf -1 und OnKeyDown der rechten Taste, auf 1 gesetzte Richtung

Dann OnKeyUp der beiden linken und rechten Tasten eingestellt Richtung auf 0.

Dann können Sie Ihren Charakter basierend auf dem Wert direction verschieben, anstatt ihn bei jedem physischen Tastendruck zu bewegen.

Sehr Pseudo-Code: // Dieses Beispiel betrifft nur Links/Rechts-Bewegung.

+0

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

+0

Ich weiß nicht, was Sie mit einer Endlosschleife meinen ... Ich dachte, alle Update-Funktionen sind in einer Endlosschleife? – Greg

+0

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

0

this.position.X + = (diese.Richtung * (this.speed + 10));