Flüssige Tastatureingaben



  • Abend,

    Ich habe eine WinForms Anwendungen mit einem Frame und 2 Panel. Die 2 Panel rendern eine 3D-Szene. Wenn der Benutzer ein Panel anklickt und Tastatureingaben macht (WASD), dann soll sich die Kamera im gerade aktiven Panel bewegen. Dazu meine Fragen:

    1. Ich habe einen EventHandler an die Enter und Leave Events des Panels angehängt, aber die Methode wird nie aufgerufen wenn ich auf das Panel oder ein anderes Control klicke. Wieso nicht? Kann ein Panel keinen Focus kriegen?

    2. Wieso werden im VS Designer die KeyEvents eines Panels nicht angezeigt?

    3. Ich habe im Code dem Panel einen Tasten Handler hinzugefügt:

    pnlVP0->KeyDown += gcnew KeyEventHandler(this, &EditorForm::Foo);
    

    Aber ich kann so wild auf die Tastatur hacken wie ich will; Foo wird nie aufgerufen. Wieso?

    4. Da die Panel KeyEvents nicht funktionieren, habe ich mich mal an das Form KeyDown Event gehängt. In KeyEvent bewege ich dann die Kamera so:

    System::Void EditorForm_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {
       if(e->KeyCode == Keys::W) 
    	 g_camera->moveForward(1000.1f);		 			
       if(e->KeyCode == Keys::S) 
         g_camera->moveBackward(1000.1f);
       // usw. Denke das Prinzip ist klar
    

    Nur leider läuft das nicht flüssig genug ab. Im Moment sieht der Ablauf so aus: Ich drücke die Taste "W", dann geht die Kamera kurz ein Stück nach vorne, dann stockt sie kurz und dann bewegt sie sich kontinuerlich nach vorne. Auch das simultane bewegen auf mehreren Achsen geht nicht (also zb nach vorne/rechts gehen). Wenn ich "D" drücke und nach rechts gehe, gedrückt halte und zusätzlich "W" drücke, dann geht die Kamera NICHT nach schräg vorne, sondern stockt kurz, und geht dann nur nach vorne.
    Wie kriege ich mit WinForms eine flüssige Bewegung hin? Geht das überhaupt?



  • zu 1-3 kann ich nichr sagen - ich kenn nur WPF - und dein code ist zudem .net/cli statt c#

    zu 4.
    mein vorschlag waere das du ueber n timer gehst
    dh du merkst dir als variable die richtung
    diese ist in alle himdelsrichtung
    bei druck auf die taske (keydown) setzt du die richtung und startest den timer
    im timer bewegst du die kamera (musst die tick geschwindigkeit und den wert der kamera nur entsprechend synchronisieren)
    und bei keyup dann stoppst du den timer und resettest die richtungs variable

    wenn du dann D macht es sinn vorher zu pruefen ob eine richtung gesetzt ist - das wuerde bedeuten das der timer noch laeuft - dann aktualisiere nur die richung



  • Mr Evil schrieb:

    zu 1-3 kann ich nichr sagen - ich kenn nur WPF - und dein code ist zudem .net/cli statt c#

    Das hier ist auch das C# UND .NET Forum. Ferner ist es völlig egal, in welcher .NET Sprache ich .NET Programme entwickel.

    Mr Evil schrieb:

    mein vorschlag waere das du ueber n timer gehst

    Eher nicht, sorry 😉
    Freue mich über weitere Vorschläge!



  • wolke7 schrieb:

    Das hier ist auch das C# UND .NET Forum.

    Und es gibt extra ein C++/CLI mit .NET Forum

    wolke7 schrieb:

    Ferner ist es völlig egal, in welcher .NET Sprache ich .NET Programme entwickel.

    Stimmt zwar, jedoch unterscheiden sich C# und Visual C++ doch in einigen Punkten. Deine Chancen jemand zu finden der sich speziell mit Visual C++ auskennt ist nunmal im entsprechenden Forum größer.



  • loks schrieb:

    Stimmt zwar, jedoch unterscheiden sich C# und Visual C++ doch in einigen Punkten. Deine Chancen jemand zu finden der sich speziell mit Visual C++ auskennt ist nunmal im entsprechenden Forum größer.

    Wer sich meine Frage durchliest wird sehen, dass mein Problem NICHTS mit der Sprache zu tun hat, sondern sich rein auf .NET bezieht (Events).



  • Ein Panel kann kein Focus bekommen, somit macht es auch keinen Sinn irgendwelche Events im Designer für KeyDown und KeyUp anzubieten.

    KeyUp Down und Press liefern Dir den Wert einer Taste. Warum das stockt kann Dir keiner sagen, Dein Projekt ist unbekannt. Generell wirst Du aber keine Tastenkombinationen abfragen können.

    Schau mal ob Du über die MessageQueue oder WinApi o.Ä. an Deine Informationen kommst. (GetKeyState und was es da geben mag). Mit was machst Du die 3D Sachen ? Eventuell bietet dieser Bereich bereits Möglichkeiten.



  • DirectX mit DirectInput ist sehr leicht zu handhaben und komfortabel ist es auch.

    Aber ka ob du mit dem einbinden der directX lib übers Ziel hinaus schießt 😉



  • Das die Tastatur-Eingabe nicht flüssig ist, ist der Normalfall.
    Öffne notepad und halte einfach mal 'x' oder so gedrückt - Da sieht man das Phänomen ebenfalls und ist da auch sinnvoll 😉

    Die Lösung:
    - Bei KeyDown in nem Array die entsprechende Taste als gedrückt markieren
    - Bei KeyUp in dem Array die Taste wieder als nicht-gedrückt markieren
    - In nem Timer oder Thread oder sonstwie dann das Array abfragen, und die Aktionen ausführen die bisher bei KeyDown ausgeführt würden...


Anmelden zum Antworten