キープレスの経過時間を取得するにはどうすればよいですか?


8

キーが押されている時間を正確に判断できるようにする必要があります。たとえば、キーが非常に速くタップされた場合、各更新フレームの時間より短い時間を報告する可能性があります。


あなたの他のコメントに基づいて、私は尋ねなければなりません、〜16msの精度を得ることは実際にあなたのゲームに有害ですか?私がこれまでに行ったほとんどすべてのゲームは、サブフレームスケールでの入力に悩まされていません。おそらく、ゲームの気分を悪くする原因が他にもあるでしょう(私はそれを想定していますが、それ以外の理由で質問しているのはなぜですか?)
Tetrad

1
マリオゲームでは、「低ジャンプのクイックタブ、高ジャンプの全押し」を実現するためにサブフレームの精度は必要ありませんでした。ジャンプの最初の2〜3フレームに加速度ベクトルを追加することをお勧めします。
Kyte


@Andrew Russel:それが答えになるはずです。
マイケルコールマン

回答:


4

System.Windows.Forms.NativeWindowクラスを使用して入力をキャプチャできます。入力イベントが発生すると通知が届きます。これにより、発生時にできるだけ早く通知が届き、時刻をより正確に記録できます。多少厄介(ネイティブ/安全でないコード)になりますが、機能します。

これはWindowsでのみ機能すると思いますが、それがターゲットプラットフォームです(XboxおよびWP7では必要ありません)。

以下は良い例です(nuclexフレームワークから):WindowInputCapturer(注:このコードは最近更新された可能性があり、コーディングしていません)

編集:これにより、キーを押したときの文字コードを取得することもできます。これはテキスト入力(特にラテン文字のようなもの)を受け取るのに役立ちます。なぜこれほど高い精度で入力を取得する必要があるのか​​はわかりませんが、これは私の意見では良い方法です。


2

XNAはループベースのフレームワークであり、イベントベースのフレームワークではありません。イベントが発生した正確な時刻が必要な場合は、winformsプロジェクト(イベントベースのプロジェクト)を検討し、レンダリングに必要な場合はXNAをコントロールに接続します。


1

キーの状態を変数に格納し、次のループで現在のキーの状態と比較します。DateTime開始点を保持するオブジェクトを作成するとDateTime.Now、以前のキーの状態が一致しない場合と比較できます。

私が意味することの非常に単純な例:

   if(currentKeyboardState.IsKeyDown(Keys.Space)
      && !previousKeyboardState.IsKeyDown(Key.Space))
      { DateTime startTime = DateTime.Now; }
    ...
    if(!currentKeyboardState.IsKeyDown(Keys.Space)
      && previousKeyboardState.IsKeyDown(Key.Space))
      { TimeSpan elapsedTime = DateTime.Now - startTime; }

具体的には、各更新の時間よりも短い時間を与えることができるものを求めました。あなたの答えは私に16msの増分で時間を与えるだけです。
AttackingHobo

1
だから、それを独自のスレッドで実行してください。XNAには、キーボードの変更のためのイベントハンドラーがありません。
riv_rec

ただし、DateTime.Nowは更新よりも解像度が低くなっています。ストップウォッチをお試しください。
Kyte

0

私はこれを行う公式の方法を知りません。非常にタイトなループで2番目のスレッドを実行して、入力をチェックし、これをスレッド間の同期をほとんど必要としない十分な大きさの循環バッファーに送信することができます。

(バッファーの各スロットに増加するある種の数を格納し、スレッドがすべてのデータを書き込んだ後、その数を減らすまでバッファーからのデータでスロットの読み取りを続けます(オーバーフローする数を確認することを忘れないでください!))


0

1秒あたり30回更新すると、キーボードの状態をサンプリングするよりも速く人間がキーを押すことができなくなります。人間が入力するよりもゆっくりと更新する場合は、グラフィックスをレンダリングするための1つのスレッドと、キーボード/マウスを読み取って応答するための別のスレッドが必要になることがあります。

ただし、人間が入力できる速度よりもゆっくりと更新すると、キーを押すたびに視覚的なフィードバックを提供できなくなります。これは、キーを押すまでの平均時間などの集計フィードバックを表示することである場合は問題になりません。


タイピングについては何も言わなかった。キーが押された時間、正確なミリ秒を知りたい。
AttackingHobo 2011

実際、人間は1秒あたり30キーを超える速度で入力できますが、持続的な速度ではなく、数キーのバーストでのみ入力できます。
AttackingHobo

1秒あたり60回更新すると、精度は16msになります。どの程度の精度が必要ですか、なぜですか?
bmcnett 2011

プレーヤーの動きについては、ユーザーがすばやく1回タップして、プレーヤーを1回押すよりも短く押すことができるようにしたいと考えています。
AttackingHobo 2011

@AttackingHoboこれに運動方程式を利用できませんか?押したまま、加速度ベクトルを速度ベクトルに適用しますか?押し続ける時間が長いほど、速度は速くなりますか?
レイデイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.