SDL CodeBlocks同时有2个键

时间:2013-02-21 12:47:34

标签: sdl codeblocks

所以,我在C编码一个斩波器,我的问题是: 如何管理SDL同时按下的两个键? 我尝试了两个开关,但没有任何关系,它不起作用:/

是否可以使用SDL进行操作?

3 个答案:

答案 0 :(得分:1)

一个例子: 如果你是,试着阅读同时按下'a''b',你可以像往常一样运行一个循环来检查事件,并且有一个名为a_true的布尔值和b_true并在循环结束时检查两者是否均为真。您可以按键检查以使其成为真,并且还可以使用键检查以使其成为错误。 没有代码,我认为任何人都不能给出更具描述性的答案。

答案 1 :(得分: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;
}

答案 2 :(得分: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之后将此代码写入您的程序中(如果有,请暂时插入{{1}在它前面,因为否则你会得到相同代码的长时间重复):

//

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