sdl连续按键
sdl getting continuously key pressing
我目前正在用 SDL(PONG 克隆)编写一个简单的游戏,我必须连续按键。
我遇到的问题是,当我按下一个按钮时,它会做出反应,等待一小段时间,然后继续连续按键。
我想知道我是如何让那一点延迟消失的。
这是我的代码:
while (running)
{
while (SDL_PollEvent(&event))
{
//update the game
if (event.type == SDL_QUIT)
{
quit_game();
running = false;
}
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
move_paddle(UP);
break;
case SDLK_UP:
move_paddle(DOWN);
break;
default:
break;
}
}
}
draw_game();
move_ball();
SDL_Delay(15);
}
我做的第一件事是我想消除小延迟并使桨的运动更顺畅。我引入了 2 个新的全局 bool 变量来跟踪按下的键。
bool key_up = false;
bool key_down = false;
我用值 false 启动它们,因为当前没有按下任何键。
在我的开关中,我将这些布尔变量的值设置为匹配当前按下的值。
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
key_up = true;
key_down = false;
break;
case SDLK_UP:
key_down = true;
key_up = false;
break;
default:
break;
}
}
然后在第一个while循环中,我为两个可以按下的键做了两个if-case,并在这些if-cases中调用移动函数。
if (key_up)
move_paddle(UP);
else if (key_down)
move_paddle(DOWN);
当我这样做时,延迟消失了,桨的运动很流畅,但它也产生了另一个问题,桨不能在一个地方静止不动(边界除外)。然后我意识到代码只是在寻找一个被按下的键,而不是对一个被释放的键做出反应。
然后我发现如果释放一个键(在本例中为向上键或向下键),则必须将两个布尔值设置为 false,因为没有按下任何键。
我所做的是在 if(event.type == SDL_KEYDOWN)
之后做了另一个 if 语句,如果没有按下任何键,它将禁用桨的移动。
if (event.type == SDL_KEYUP)
{
key_down = false;
key_up = false;
}
当我在我的代码中实现所有这些时,游戏就像一个魅力。
对于那些感兴趣的人,这是我新的最终代码:
int gameloop()
{
SDL_Event event;
bool running = true;
bool key_up = false;
bool key_down = false;
while (running)
{
while (SDL_PollEvent(&event))
{
//update the game
if (event.type == SDL_QUIT)
{
quit_game();
running = false;
}
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
key_up = true;
key_down = false;
break;
case SDLK_UP:
key_down = true;
key_up = false;
break;
default:
break;
}
}
if (event.type == SDL_KEYUP)
{
key_down = false;
key_up = false;
}
}
if (key_up)
move_paddle(UP);
else if (key_down)
move_paddle(DOWN);
move_ball();
ai_paddle_move();
draw_game();
printf("Player: %d | AI: %d\n", player, ai);
SDL_Delay(15);
}
return 1;
}
我目前正在用 SDL(PONG 克隆)编写一个简单的游戏,我必须连续按键。
我遇到的问题是,当我按下一个按钮时,它会做出反应,等待一小段时间,然后继续连续按键。
我想知道我是如何让那一点延迟消失的。
这是我的代码:
while (running)
{
while (SDL_PollEvent(&event))
{
//update the game
if (event.type == SDL_QUIT)
{
quit_game();
running = false;
}
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
move_paddle(UP);
break;
case SDLK_UP:
move_paddle(DOWN);
break;
default:
break;
}
}
}
draw_game();
move_ball();
SDL_Delay(15);
}
我做的第一件事是我想消除小延迟并使桨的运动更顺畅。我引入了 2 个新的全局 bool 变量来跟踪按下的键。
bool key_up = false;
bool key_down = false;
我用值 false 启动它们,因为当前没有按下任何键。
在我的开关中,我将这些布尔变量的值设置为匹配当前按下的值。
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
key_up = true;
key_down = false;
break;
case SDLK_UP:
key_down = true;
key_up = false;
break;
default:
break;
}
}
然后在第一个while循环中,我为两个可以按下的键做了两个if-case,并在这些if-cases中调用移动函数。
if (key_up)
move_paddle(UP);
else if (key_down)
move_paddle(DOWN);
当我这样做时,延迟消失了,桨的运动很流畅,但它也产生了另一个问题,桨不能在一个地方静止不动(边界除外)。然后我意识到代码只是在寻找一个被按下的键,而不是对一个被释放的键做出反应。
然后我发现如果释放一个键(在本例中为向上键或向下键),则必须将两个布尔值设置为 false,因为没有按下任何键。
我所做的是在 if(event.type == SDL_KEYDOWN)
之后做了另一个 if 语句,如果没有按下任何键,它将禁用桨的移动。
if (event.type == SDL_KEYUP)
{
key_down = false;
key_up = false;
}
当我在我的代码中实现所有这些时,游戏就像一个魅力。
对于那些感兴趣的人,这是我新的最终代码:
int gameloop()
{
SDL_Event event;
bool running = true;
bool key_up = false;
bool key_down = false;
while (running)
{
while (SDL_PollEvent(&event))
{
//update the game
if (event.type == SDL_QUIT)
{
quit_game();
running = false;
}
if(event.type == SDL_KEYDOWN)
{
switch (event.key.keysym.sym)
{
case SDLK_DOWN:
key_up = true;
key_down = false;
break;
case SDLK_UP:
key_down = true;
key_up = false;
break;
default:
break;
}
}
if (event.type == SDL_KEYUP)
{
key_down = false;
key_up = false;
}
}
if (key_up)
move_paddle(UP);
else if (key_down)
move_paddle(DOWN);
move_ball();
ai_paddle_move();
draw_game();
printf("Player: %d | AI: %d\n", player, ai);
SDL_Delay(15);
}
return 1;
}