我正在尝试在按住键盘的同时在菜单中获得键盘延迟效果。目前它可以工作,但不会改变方向。例如,我可以按住并保持向右,光标世界向右移动,然后暂停,然后继续向右移动(如预期的那样)。我可以释放并按下右键或按住右键,它会起作用。向左按住不起作用,光标立即全速运转。奇怪的是,如果我释放并保持在那之后它起作用。在此之后按住并使光标立即以全速移动,如上所述,这只会影响第一次。
这是我正在处理的函数:(许多变量是全局变量,如果未在函数中声明它是全局的,则为o)
int handleEvents() {
static int lcount = 0;
static int rcount = 0;
while(SDL_PollEvent(&e)) {
if(e.type == SDL_QUIT) end++; //quit code
if(e.type == SDL_KEYDOWN) {
switch (e.key.keysym.sym) {
case SDLK_ESCAPE: end++; break;
case SDLK_LEFT: lDown = 1; break;
case SDLK_RIGHT: rDown = 1; break;
}
}
if(e.type == SDL_KEYUP) {
switch (e.key.keysym.sym) {
case SDLK_LEFT: lDown = 0; break;
case SDLK_RIGHT: rDown = 0; break;
}
}
}
int now = SDL_GetTicks();
if (lDown && curLocation > 0 && (now-ltime > 1500 || (now-ltime > 250 && lcount>0))) {
curLocation--;
lcount++;
ltime = SDL_GetTicks();
}
if (rDown && curLocation < 18 && (now-rtime > 1500 || (now-rtime > 250 && rcount>0))) {
curLocation++;
rcount++;
rtime = SDL_GetTicks();
}
if (!lDown) {
lcount = 0;
ltime = now - 1500;
}
if (!rDown) {
rcount = 0;
rtime = now - 1500;
}
return 0;
}
在阅读本网站上的早期问题后,我找到SDL_EnableKeyRepeat()
。我找不到任何如何在程序中使用它的例子,但无论如何我都试过了。这是相同功能的缩减版本:
int handleEvents() {
int mouseMotion = 0;
SDL_EnableKeyRepeat(500, 250);
while(SDL_PollEvent(&e)) {
if(e.type == SDL_QUIT) end++; //quit code
if(e.type == SDL_KEYDOWN) {
switch (e.key.keysym.sym) {
case SDLK_ESCAPE: end++; break;
case SDLK_LEFT: curLocation--; break;
case SDLK_RIGHT: curLocation++; break;
}
}
}
return 0;
}
这个没有重复。