2016-04-05 25 views
2

OpenGLアプリケーションのC#でキー押下を検出するクロスプラットフォーム(Win & MacOS)メソッドを探しています。OpenTKキーを押しますか?

以下は機能しますが、英数字のみで動作します。

protected override void OnKeyPress(OpenTK.KeyPressEventArgs e) 
{ 
    if (e.KeyChar == 'F' || e.KeyChar == 'f') 
     DoWhatever(); 
} 

現在、私は、それをハッキングユーザーがキーを離したときに検出しています:

OpenTK.Inputを使用して
void HandleKeyUp (object sender, KeyboardKeyEventArgs e) 
{ 
    if (e.Key == Key.Tab) 
     DoWhatever(); 
} 

キーが開催されている場合は、私がテストすることができますが、私は後です最初のキーを押すだけです。

var state = OpenTK.Input.Keyboard.GetState(); 

if (state[Key.W]) 
    DoWhatever(); 

OpenTKユーザーがキーを登録しようとしていますか?単に以前のメインループのものに現在のキーボードの状態を比較することにより、Gusmanによって示唆されるよう

SOLUTION

KeyboardState keyboardState, lastKeyboardState; 

protected override void OnUpdateFrame(FrameEventArgs e) 
{ 
    // Get current state 
    keyboardState = OpenTK.Input.Keyboard.GetState(); 

    // Check Key Presses 
    if (KeyPress(Key.Right)) 
      DoSomething(); 

    // Store current state for next comparison; 
    lastKeyboardState = keyboardState; 
} 

public bool KeyPress(Key key) 
{ 
    return (keyboardState [key] && (keyboardState [key] != lastKeyboardState [key])); 
} 

答えて

3

あなたの気持ちをちょっと変えれば、それははっきりと分かります。

OpenGLアプリケーションをプログラミングしているので、オブジェクトを更新してレンダリングするメインループがあります。

ループ内でキーボードの状態を取得し、キーボードのすべての変更があった以前の保存状態と比較した場合、キーの変更でイベントを呼び出す(または関数を呼び出す)のは簡単です。

このように、OpenTKに固有の仕組みを使用し、100%移植性があります。

+0

質問に私の解決策を追加しました、ありがとうございました。 –

+0

これは基本的な使用のための実用的な解決策ですが、これはあなたのOpenGLアプリケーション内でユニコードまたは非英語のキーボード入力を提供したい場合にはうまくいかないでしょう:/ – Tyron

+0

@Tyronユニコードについてはわかりませんが、それは常にスペイン語で、失敗しなかったので、列挙型とキーの間の実際のマッピングを知る必要があります。 – Gusman

関連する問題