Ich muss in der Lage sein zu bestimmen, wie lange ein Schlüssel mit hoher Genauigkeit gedrückt wurde. Wenn sie beispielsweise sehr schnell auf die Taste tippen, wird möglicherweise eine Zeit gemeldet, die kürzer als die Zeit für jeden Aktualisierungsrahmen ist.
8
Antworten:
Sie können die Eingabe mithilfe der System.Windows.Forms.NativeWindow-Klasse erfassen. Sie erhalten eine Benachrichtigung, wenn ein Eingabeereignis auftritt. Auf diese Weise werden Sie so schnell wie möglich benachrichtigt, sobald es auftritt, sodass Sie die Zeit mit einer höheren Genauigkeit aufzeichnen können. Es wird etwas chaotisch (nativer / unsicherer Code), aber es funktioniert.
Ich denke, dies funktioniert nur unter Windows, aber ich denke, das ist die Plattform, auf die Sie abzielen (dies ist auf Xbox und WP7 nicht erforderlich).
Hier ist ein gutes Beispiel (aus dem Nuclex-Framework): WindowInputCapturer (Hinweis: Dieser Code wurde möglicherweise kürzlich aktualisiert und ich habe ihn nicht codiert. )
Bearbeiten: Hiermit können Sie auch den Zeichencode des Tastendrucks abrufen. Dies könnte nützlich sein, um Texteingaben zu machen (insbesondere Dinge wie lateinische Zeichen). Ich bin mir nicht sicher, warum Sie Eingaben mit so hoher Präzision benötigen würden, aber dies wäre meiner Meinung nach eine gute Möglichkeit, dies zu tun.
quelle
XNA ist ein Loop-basiertes Framework, kein ereignisbasiertes Framework. Wenn Sie den genauen Zeitpunkt benötigen, zu dem ein Ereignis aufgetreten ist, ziehen Sie ein Winforms-Projekt (ein ereignisbasiertes Projekt) in Betracht und verbinden Sie XNA bei Bedarf mit einem Steuerelement zum Rendern.
quelle
Speichern Sie den Schlüsselstatus in einer Variablen und vergleichen Sie ihn in der nächsten Schleife mit den aktuellen Schlüsselzuständen. Erstellen Sie ein
DateTime
Objekt, das den Start enthält, und vergleichen Sie es,DateTime.Now
wenn der vorherige Schlüsselstatus nicht übereinstimmt.Sehr einfaches Beispiel für das, was ich meine:
quelle
Mir ist kein offizieller Weg bekannt, dies zu tun. Sie könnten einen zweiten Thread in einer sehr engen Schleife ausführen, um die Eingabe zu überprüfen und diesen an einen kreisförmigen Puffer zu senden, der groß genug ist, um nur eine sehr geringe Synchronisation zwischen den Threads zu erfordern.
(Speichern Sie eine zunehmende Zahl in jedem Steckplatz des Puffers und aktualisieren Sie diese, nachdem der Thread alle Daten geschrieben hat. Lesen Sie dann die Steckplätze mit Daten aus dem Puffer weiter, bis die Anzahl abnimmt (vergessen Sie nicht, nach überfüllten Zahlen zu suchen!))
quelle
Wenn Sie dreißig Mal pro Sekunde aktualisieren, kann ein Mensch die Tasten nicht schneller drücken, als Sie den Tastaturstatus abtasten können. Wenn Sie langsamer aktualisieren, als ein Mensch eingeben kann, benötigen Sie möglicherweise einen Thread zum Rendern von Grafiken und einen anderen Thread zum Lesen und Reagieren auf die Tastatur / Maus.
Wenn Sie jedoch langsamer aktualisieren, als ein Mensch eingeben kann, können Sie auch nicht für jeden Tastendruck ein visuelles Feedback geben. Dies spielt keine Rolle, wenn die Idee darin besteht, aggregiertes Feedback anzuzeigen, z. B. die durchschnittliche Zeit zwischen Tastendrücken.
quelle