所以,我正在用 C 编写一个choplifter,我的问题是:如何使用 SDL 管理同时按下的两个键?我尝试了两个开关,但没有什么可做的,它不起作用:/
是否可以使用 SDL 做到这一点?
所以,我正在用 C 编写一个choplifter,我的问题是:如何使用 SDL 管理同时按下的两个键?我尝试了两个开关,但没有什么可做的,它不起作用:/
是否可以使用 SDL 做到这一点?
一个例子:如果你试图读取两者是否同时'a'
被'b'
按下,你可以像往常一样运行一个循环来检查事件并调用布尔值a_true
并b_true
在循环结束时检查两者是否为真. 您可以通过按键检查使它们为真,也可以通过按键释放检查使它们为假。没有代码,我认为没有人可以给出更具描述性的答案。
当我这样做时,我个人喜欢使用 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;
}
如果您想要支持按 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 中。