OpenTK按键?

时间:2016-04-05 09:03:28

标签: c# opengl opentk

我正在寻找一种跨平台(Win& MacOS)方法来检测C#中用于OpenGL应用程序的按键。

以下有效,但仅适用于字母数字字符。

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

目前,我正在攻击它,检测用户何时释放密钥:

void HandleKeyUp (object sender, KeyboardKeyEventArgs e)
{
    if (e.Key == Key.Tab)
        DoWhatever();
}

使用OpenTK.Input,我可以测试一个键是否被保留,但我只是在初始按键之后。

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

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

那么,OpenTK用户采用什么方法来注册按键?

正如古斯曼所建议的那样,只需将当前的键盘状态与前一个主循环的键盘状态进行比较即可。

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]) );
}

1 个答案:

答案 0 :(得分:3)

改变一下你的想法,你会看得很清楚。

您正在编写OpenGL应用程序,因此您有一个主循环来更新和渲染对象。

如果在该循环中你获得键盘状态并与之前存储的状态进行比较,你就可以完成所有键盘更改,那么使用键更改就可以轻松激活你自己的事件(或者只是调用函数)。

通过这种方式,您将使用OpenTK的固有机制,并且100%便携。