推广键盘输入

时间:2015-11-04 16:42:45

标签: c++ linux windows keyboard

我目前正在撰写游戏开发引擎,而且我很难弄清楚如何最好地推广键盘输入。

我想做类似的事情:

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.
  }
}

这是否可以独立运作平台和语言?

提前致谢。

0 个答案:

没有答案