SDL(和其他)虚拟键输入

时间:2012-10-09 21:33:41

标签: c++ events sdl

今天我在我的应用程序中设置了所有不同键的输入。除了虚拟键(例如,插入符号或符号)之外,这种方法很好。通常需要换班的钥匙。使用SDL这些虚拟键不起作用。因为他们没有注册活动。

if (event.type == SDL_KEYDOWN) {
        switch (event.key.keysym.sym) {
            case SDLK_CARET:
                Keys[KeyCodes::Caret] = KeyState::Down;
                break;
            case SDLK_UP:
                Keys[KeyCodes::Up] = KeyState::Down;
                break;
            default:
                break;
        }

我绝对相信我的系统可以使用像Up这样的物理键。该程序像这样查询一个keystate:

if (Keys[KeyCode] == KeyState::Down) {
    lua_pushboolean(L, true);
} else {
    lua_pushboolean(L, false);
}

KeyCode作为参数传入。

那么为什么虚拟键或需要转换的键无法使用SDL的KeyDown事件类型?是否需要更多代码才能获得它们?或者我是傻瓜?

2 个答案:

答案 0 :(得分:1)

SDL仅报告真实的关键事件。

好消息是你可以enable Unicode translation获得像'^'或'@'这样的符号。

首先将它放在初始化代码中:

SDL_EnableUNICODE(1);

现在SDL_KEYDOWN个事件将在SDL_keysymunicode成员中包含相应的字符。当将按键翻译成字符时,这会导致移位,大写锁定等因素。像SDLK_UP这样的密钥会有unicode == 0

这实际上使keysym.unicode成为文本输入的理想选择,尤其是与SDL_EnableKeyRepeat一起使用时。

以下是一个示例:在我的键盘上,我按shift-6生成^。该计划通过SDL_KEYDOWNkeysym.sym == SDLK_6收到keysym.unicode == '^'个活动。

唯一需要注意的是,只有关键的事件才会被翻译,而不是发布事件。但这不应该是一个大问题,因为你不应该使用文本字符进行游戏控制,只有真正的键。如果您正在使用键重复进行文本输入,则仅在按下键时才会生效,而不是释放。

您可能需要使用keysym.symkeysym.unicode进行混合匹配才能满足您的确切需求。

答案 1 :(得分:0)

好的我为稍微感到沮丧而道歉但是我终于得到了一些代码来告诉我们有人按下了Caret键。我希望其他人能找到这些有用的信息。

case SDLK_6:
    if (event.key.keysym.mod == KMOD_LSHIFT || event.key.keysym.mod == KMOD_RSHIFT) {
        Keys[KeyCodes::Caret] = KeyState::Down;
    } else {
        Keys[KeyCodes::n6] = KeyState::Down;
    }
    break;

基本上,当检查具有移位的普通键时,单击特殊键,然后检查键修饰符。我现在了解unicode值,但现在这个想法似乎更简单了。

再次感谢所有的帮助!