我在乒乓球游戏中遇到SDL 2.0键盘输入问题。当我按左箭头命令向左移动时,它由SDL_PollEvents()处理,如果按下键一次,则响应正确。但是,如果我按下按键,我会在连续移动之前得到短暂的延迟(只要Windows键重复延迟)。
这是函数处理事件:
void Event::PlayerEvent (Player &player)
{
while (SDL_PollEvent (&mainEvent))
{
switch (mainEvent.type)
{
case SDL_KEYDOWN :
switch (mainEvent.key.keysym.sym)
{
case SDLK_ESCAPE :
gameRunning = false;
break;
case SDLK_LEFT :
player.moving = player.left;
break;
case SDLK_RIGHT :
player.moving = player.right;
}
break;
case SDL_QUIT :
gameRunning = false;
}
}
}
编辑:毕竟,我设法通过在程序开始时调用SystemParametersInfo(SPI_SETKEYBOARDDELAY,0,0,0)和最后调用SystemParametersInfo(SPI_SETKEYBOARDDELAY,1,0,0)来修复此问题,以返回到标准键重复延迟。
对于游戏移动,您通常不会使用事件,而是使用状态。
尝试在事件循环之外使用SDL_GetKeyboardState():
const Uint8* keystates = SDL_GetKeyboardState(NULL);
...
if(keystates[SDL_SCANCODE_LEFT])
player.moving = player.left;
else if(keystates[SDL_SCANCODE_RIGHT])
player.moving = player.right;
就那么简单
int vertical = 0;
int horizontal = 0;
float x = 500;
float y = 500;
float speed = 5.0;
在你的sdl循环中:
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_KEYDOWN:
{
switch (event.key.keysym.sym)
{
case SDLK_LEFT: horizontal=-1; break;
case SDLK_RIGHT: horizontal = 1; break;
case SDLK_UP: vertical=-1; break;
case SDLK_DOWN: vertical=+1; break;
}
break;
}
case SDL_KEYUP:
{
switch (event.key.keysym.sym)
{
case SDLK_LEFT: horizontal = 0; break;
case SDLK_RIGHT: horizontal = 0; break;
case SDLK_UP: vertical = 0; break;
case SDLK_DOWN: vertical = 0; break;
}
break;
}
}
}
x += horizontal * speed;
y += vertical * speed;
使用SDL_GetKeyboardState捕获 - 在(SDL_PollEvent(&mainEvent))之外,工作正常。