我正在寻找一种跨平台(Win&MacOS)方法来检测OpenGL应用程序在C#中的按键。
以下工作,但仅适用于字母数字字符。
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用户采用什么方法来注册按键?
解
正如Gusman所建议的,只需将当前键盘状态与上一个主循环的状态进行比较即可。
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]) );
}
最佳答案
稍微改变主意,您会清楚地看到它。
您正在编写OpenGL应用程序,因此您有一个主循环,您可以在其中更新和渲染对象。
如果在该循环中您获得了键盘状态并与以前的存储状态进行了比较,则您拥有所有键盘更改,那么使用键更改来触发您自己的事件(或仅调用函数)非常容易。
这样,您将对OpenTK使用固有机制,并且100%可移植。