所以,我在C编码一个斩波器,我的问题是: 如何管理SDL同时按下的两个键? 我尝试了两个开关,但没有任何关系,它不起作用:/
是否可以使用SDL进行操作?
答案 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中。