【问题标题】:How to correctly handle control-key combinations in SDL2如何正确处理 SDL2 中的控制键组合
【发布时间】:2017-01-10 14:06:12
【问题描述】:

在我的基于 SDL 2.0 的应用程序中,我想同时处理 Control +Control =

我知道我可以处理SDL_KEYDOWN 事件并结合KEYMODE_CTRL 查找SDLK_EQUALS 键码。甚至检查KEYMOD_SHIFT' to distinguish between+and=`。但是,这不是便携式的,并且在这些符号映射到不同键的键盘上会中断。

我尝试过的另一件事是启用SDL_StartTextInput(),然后监听SDL_TEXTINPUT 事件。但是,这只适用于可打印的字符。它完全忽略控制序列。

这样做的正确方法是什么?我看到SDL 1.2 实际上在SDL_Keysym 结构中有一个unicode 字段。这对我来说肯定会容易得多。有谁知道为什么要删除它以及 SDL 2.0 中的等价物是什么?

【问题讨论】:

  • 我觉得是换成文本输入事件了,看看wiki.libsdl.org/Tutorials/TextInput
  • @keltar 问题是 TextInput 吞下了控制键。它仅适用于可打印字符。我可以阅读代码以了解它在内部是如何工作的,并且可能会构建类似的东西,但我不想这样做。
  • 但是如果 ctrl 不是输入序列的一部分,你仍然有 keydown 事件,所以你可以将两者结合起来。
  • @keltar 我没有收到SDL_TEXTINPUT 不可打印控制字符的事件。喜欢C-+
  • 但是你有一个用于+SDL_KEYDOWN 用于ctrl,对吧? (至少我会)

标签: keyboard-events sdl-2


【解决方案1】:

这是一个示例,您如何将 unicode 输入作为 SDL_TEXTINPUT,而其余的作为 SDL_KEYDOWN:

#include "SDL.h"

int main(int argc, char *argv[]) {
    int done = 0;
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window *w = SDL_CreateWindow("foo", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
            640, 480, 0);

    int lctrl = 0, rctrl = 0;

    SDL_StartTextInput();
    while (!done) {
        SDL_Event event;
        while(SDL_PollEvent(&event)) {
            switch (event.type) {
            case SDL_QUIT:
                done = 1;
                break;
            case SDL_TEXTINPUT: {
                int ctrl_state = lctrl || rctrl;
                printf("%s, ctrl %s\n", event.text.text, (ctrl_state) ? "pressed" : "released");
            } break;
            case SDL_KEYDOWN:
                if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 1; }
                else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 1; }
                break;
            case SDL_KEYUP:
                if(event.key.keysym.sym == SDLK_RCTRL) { rctrl = 0; }
                else if(event.key.keysym.sym == SDLK_LCTRL) { lctrl = 0; }
                break;
            }
        }
        SDL_UpdateWindowSurface(w);
    }

    SDL_Quit();

    return 0;
}

为了简化事情,它忽略了 SDL_TEXTEDITING,它可能(或不是)你想要的。也可以使用SDL_GetKeyboardState,而不是手动处理事件和累积修饰键标志,结果相同。

【讨论】:

  • 这真是一个很好的例子。但也许您想添加#include <stdio.h> 以使其完美...
猜你喜欢
  • 1970-01-01
  • 2014-12-06
  • 2020-02-25
  • 1970-01-01
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多