Hi Leute!
Bin vor wenigen Tagen mal wieder durch die Alten Beiträge in diesem Forum gesurft und bin dann immer wieder auf Postings gestoßen, in denen neue User Probleme mit Tastaturabfragen einbringen[Objekt mit Tastatur bewegen]. Ebenso hatte ich einmal vor Jahren (in VB.NET) das Problem, dass ich mehrfache Tastatur Eingaben nicht verarbeiten konnte. Ich war nur in der Lage immer einen Tastendruck gleichzeitig zu prüfen. Das ist natürlich in einer Anwendung, in der man mit WASD sich bewegen kann und man diagonal gehen will, nicht unbedingt optimal ;/
Jedenfalls hab ich mich mal hingesetzt und eine kleine Möglichkeit erschaffen *hust räusper* (kopiert von C Razor Sharp[crazorsharp.blogspot.de/search/label/GetKeyState])
Dabei war es mir wichtig, dass die Lösung
1.) Einfach zu verwenden ist
2.) Der Code verständlich ist (Ok eine Stelle gibts, die is etwas komplizierter) und
3.) Kurz zu halten ist
Vorteil meiner Lösung:
+ Man braucht keine aufgeplusterten Select/Switch Case-Abfragen
+ Es können mehrer Tasten abgefrag werden (Im Gegensatz zu KeyDown und KeyPress-Events)
Für GameLoop
Wie in dem Blogeintrag schon beschrieben wurde, besteht so eine GameLoop aus 2 Bestanteile:
1.) Die Update-Methode:
ist dafür zuständig, dass Tastaturdrücke abgefragt werden und die Positionen der Entities neu setzen. Kurz: Die Game-Logik zu updaten
2.)Die Draw-Methode:
ist dafür zuständig, dass die ganzen Inhalte des UI neu gezeichnet werden
In einer ganz normalen Window-Forms Anwendung braucht man für die Realisierung des Vorhabens einen einfachen Kreis mit den Pfeiltasten zu bewegen nur eine Klasse, die den Ball/den Kreis darstellt und einen Timer auf der MainForm.
Bei besagter WinForms-Anwendung ist das Tick-Event des Timers die Update-Methode und OnPain()-Methode der MainForm die Draw-Methode
In der OnPain wird jedes Element auf dem UI neu gezeichnet. Das erreicht man, indem jedes Element eine Draw-Methode implementiert, die in der OnPain aufgerufen wird.
Bsp ist im Anhang enthalten
Hier ist mal der Code zur KeyboardInfo-Klasse:
KeyboardInfo-Klasse
Um jetzt Tasten abfzufragen, musst nur eine Referenzvariable vom Typen
Zur Verwendung:
Wenn man nicht gerade eine Supermegaumfangreiche GameEngin, wie Sharpex2D[Sharpex2D 1.3.0 | 2D Game Framework] hernimmt, sondern sich in Grafikprogrammierung/spielentwicklung rantasten will, indem man eigene Projekt zuerst mal mit WinForms löst, hat man mit der Lösung einen einfachen Einstieg
Lg Radinator
Bin vor wenigen Tagen mal wieder durch die Alten Beiträge in diesem Forum gesurft und bin dann immer wieder auf Postings gestoßen, in denen neue User Probleme mit Tastaturabfragen einbringen[Objekt mit Tastatur bewegen]. Ebenso hatte ich einmal vor Jahren (in VB.NET) das Problem, dass ich mehrfache Tastatur Eingaben nicht verarbeiten konnte. Ich war nur in der Lage immer einen Tastendruck gleichzeitig zu prüfen. Das ist natürlich in einer Anwendung, in der man mit WASD sich bewegen kann und man diagonal gehen will, nicht unbedingt optimal ;/
Jedenfalls hab ich mich mal hingesetzt und eine kleine Möglichkeit erschaffen *hust räusper* (kopiert von C Razor Sharp[crazorsharp.blogspot.de/search/label/GetKeyState])
Dabei war es mir wichtig, dass die Lösung
1.) Einfach zu verwenden ist
2.) Der Code verständlich ist (Ok eine Stelle gibts, die is etwas komplizierter) und
3.) Kurz zu halten ist
Vorteil meiner Lösung:
+ Man braucht keine aufgeplusterten Select/Switch Case-Abfragen
+ Es können mehrer Tasten abgefrag werden (Im Gegensatz zu KeyDown und KeyPress-Events)
Wie in dem Blogeintrag schon beschrieben wurde, besteht so eine GameLoop aus 2 Bestanteile:
1.) Die Update-Methode:
ist dafür zuständig, dass Tastaturdrücke abgefragt werden und die Positionen der Entities neu setzen. Kurz: Die Game-Logik zu updaten
2.)Die Draw-Methode:
ist dafür zuständig, dass die ganzen Inhalte des UI neu gezeichnet werden
In einer ganz normalen Window-Forms Anwendung braucht man für die Realisierung des Vorhabens einen einfachen Kreis mit den Pfeiltasten zu bewegen nur eine Klasse, die den Ball/den Kreis darstellt und einen Timer auf der MainForm.
Bei besagter WinForms-Anwendung ist das Tick-Event des Timers die Update-Methode und OnPain()-Methode der MainForm die Draw-Methode
In der OnPain wird jedes Element auf dem UI neu gezeichnet. Das erreicht man, indem jedes Element eine Draw-Methode implementiert, die in der OnPain aufgerufen wird.
Bsp ist im Anhang enthalten
Hier ist mal der Code zur KeyboardInfo-Klasse:
C#-Quellcode
- class KeyboardInfo
- {
- private KeyboardInfo() { }
- [DllImport("User32")]
- private static extern short GetKeyState(int vKey); //WinAPI-Funktion für den KeyState
- public static KeyStateInfo GetState(Keys key)
- {
- short keyState = GetKeyState((int)key); //Aufruf der WinAPI
- /*
- MSDN-Dokumentation zu GetKeyState() [https://msdn.microsoft.com/en-us/library/ms646301(VS.85).aspx]:
- If the high-order bit is 1, the key is down; otherwise, it is up.
- If the low-order bit is 1, the key is toggled.
- A key, such as the CAPS LOCK key, is toggled if it is turned on.
- The key is off and untoggled if the low-order bit is 0.
- A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, and off when the key is untoggled.
- */
- int high = keyState > 0 ? //Wenn KeyState größer als 1 ist
- keyState >> 0x10 :
- (keyState >> 0x10) & 0x1;
- int low = keyState & 0xffff;
- bool toggled = low == 1;
- bool down = high == 1;
- bool up = high != 1;
- return new KeyStateInfo(up, down, toggled);
- }
- }
- public struct KeyStateInfo
- {
- private bool _isUp;
- private bool _isDown;
- private bool _isToggled;
- public KeyStateInfo(bool isUp, bool isDown, bool isToggled)
- {
- this._isUp = isUp;
- this._isDown = isDown;
- this._isToggled = isToggled;
- }
- public bool IsUp
- { get
- {
- return this._isUp == true;
- }
- }
- public bool IsDown
- {
- get
- {
- return this._isDown == true;
- }
- }
- public bool IsToggled
- {
- get
- {
- return this._isToggled == true;
- }
- }
- }
Um jetzt Tasten abfzufragen, musst nur eine Referenzvariable vom Typen
KeyStateInfo
erzeugt werden und mit dem Ergebnis der Statischen Funktion GetState(), die als Parameter die gewünschten Taste enthält, befüllt werden. Hierbei können ALLE Tasten verwendet werden, die in der System.Windows.Forms.Keys
-Enumeration erfasst sind.Zur Verwendung:
Wenn man nicht gerade eine Supermegaumfangreiche GameEngin, wie Sharpex2D[Sharpex2D 1.3.0 | 2D Game Framework] hernimmt, sondern sich in Grafikprogrammierung/spielentwicklung rantasten will, indem man eigene Projekt zuerst mal mit WinForms löst, hat man mit der Lösung einen einfachen Einstieg
Lg Radinator
In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell