1

所以,我正在用 C 编写一个choplifter,我的问题是:如何使用 SDL 管理同时按下的两个键?我尝试了两个开关,但没有什么可做的,它不起作用:/

是否可以使用 SDL 做到这一点?

4

3 回答 3

1

一个例子:如果你试图读取两者是否同时'a''b'按下,你可以像往常一样运行一个循环来检查事件并调用布尔值a_trueb_true在循环结束时检查两者是否为真. 您可以通过按键检查使它们为真,也可以通过按键释放检查使它们为假。没有代码,我认为没有人可以给出更具描述性的答案。

于 2013-02-22T03:18:03.460 回答
0

当我这样做时,我个人喜欢使用 SDL_GetKeyState 手动检查键盘上的每个键,使用类似于以下代码的代码:

int *keystates;

keystates = SDL_GetKeyState(NULL);
if (keystates[SDLK_a]) {
    a_key_pressed = true;
} else {
    a_key_pressed = false;
}
if (keystates[SDLK_b]) {
    b_key_pressed = true;
} else {
    b_key_pressed = false;
}

SDL 中所有键名的完整列表可在http://www.libsdl.org/docs/html/sdlkey.html#AEN4720获得

理想情况下,您可以将其作为一个函数来轻松检查任何键,如下所示:(未经测试,但概念是正确的)

BOOL CheckKey(int keyname) {
    int *keystates = SDL_GetKeyState(NULL);
    if (keystates[keyname]) {
        return TRUE;
    }
    return FALSE;
}
于 2013-02-26T21:35:35.493 回答
0

如果您想要支持按 CTRL 和另一个按钮(例如 CTRL+A),则可以使用 unicode。优点是使用非常简单,并且与 AZERTY 键盘兼容。因此,如果您想这样做以支持 CTRL+某事,我建议使用它。但是,对于任何其他用途,它都不起作用,因此请使用其他答案之一。这是一个关于如何使用它的例子:

switch(event.type){
    case SDL_KEYDOWN:
        SDL_EnableUNICODE(1);
        switch(event.key.keysym.unicode){
            case 1:   //CTRL+A
                //code
                break;
            case 97:  //A
                //code
                break;
        }
}

要获取每个键组合的代码,请在确保代码中没有任何代码之后在程序中编写此代码SDL_EnableKeyRepeat(或者如果有,请//在其前面临时插入,否则您将获得长时间的重复相同的代码):

fprintf(stderr,"%d",event.key.keysym.unicode);

并且相关组合的代码位于与可执行文件相同的文件夹中的文件 stderr.txt 中。

于 2016-07-06T12:31:59.080 回答