我目前正在撰写游戏开发引擎,而且我很难弄清楚如何最好地推广键盘输入。
我想做类似的事情:
void onKeyDown(int key)
{
// Set key down state to true.
}
void onKeyUp(int key)
{
// Set key down state to false.
}
void update()
{
if (/* is key down */)
{
// Do something.
}
}
现在我需要知道我必须保存哪些数据结构才能保存关键状态。起初我以为bool[256]
数组就足够了,但控制字符呢?
然后我考虑使用像map< int, bool>
这样的地图。这适用于不同的语言吗?我想用key_states['a']
检查关键状态,或者使用key_states[Key::Enter]
这样的不可打印字符来定义常量。如果来自亚洲的人会输入一些亚洲人物怎么办?那还行吗?
在我的linux机器上有3种不同的表示形式。一把钥匙首先,有一个关键代码似乎对我试图做的事情不切实际。接下来是表示是keysym和字符串表示。因为我还需要知道何时按下不可打印的键(例如输入键),我想这个字符串表示是不可用的。
所以这给我留下了钥匙。这是我在linux上生成的一点测试输出(我点击了&#39; a&#39;,&#39; Shift-a&#39;,&#39; Ctrl-a&#39;和&#39; Alt -a&#39;:
DOWN: KeyCode: 38 '&', KeySym: 97 'a', String: 'a'
DOWN: KeyCode: 50 '2', KeySym: 65505 '<E1>', String: ''
DOWN: KeyCode: 38 '&', KeySym: 65 'A', String: 'A'
DOWN: KeyCode: 37 '%', KeySym: 65507 '<E3>', String: ''
DOWN: KeyCode: 38 '&', KeySym: 97 'a', String: '^A'
DOWN: KeyCode: 64 '@', KeySym: 65513 '<E9>', String: ''
DOWN: KeyCode: 38 '&', KeySym: 97 'a', String: 'a'
似乎keysym总是与可打印字符的字符串表示相同。这是否适用于所有语言?如果是的话,我总是可以将keysym作为key_states
地图的关键。然后上面的用例看起来像:
void onKeyDown(int keysym)
{
key_states[keysym] = true;
}
void onKeyUp(int keysym)
{
key_states[keysym] = false;
}
void update()
{
// Check if Ctrl-a was pressed.
if (key_states[Key::Ctrl] && key_states['a'])
{
// Do something.
}
}
这是否可以独立运作平台和语言?
提前致谢。