c-如何在sdl中同时使用键盘的两个键

  • 本文关键字:键盘 两个 sdl c sdl
  • 更新时间 :
  • 英文 :


我正在用SDL用C编写一个简单的游戏,我定义了玩家一用键盘的箭头键控制它的_for example_tank,玩家二用键盘的"W"、"a"、"s"、"D"键控制它。

我的问题是他们不能同时按键。

我有一个名为"handle_events"的函数,它控制游戏无限期中的事件,其代码如下:

int handle_events(Tank* tank,Tank* tanker, Wall walls[]){
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT)
return EXIT;
if (event.type == SDL_KEYDOWN){
if(event.key.keysym.sym==SDLK_UP){
move_tank_forward(tank,colliding(tank,walls));
}else if(event.key.keysym.sym==SDLK_DOWN){
move_tank_back(tank,colliding(tank,walls));
} else if(event.key.keysym.sym==SDLK_RIGHT || event.key.keysym.sym==SDLK_LEFT) {
turn_tank(event.key.keysym.sym, tank);
} else if(event.key.keysym.sym==SDLK_w){
move_tank_forward(tanker,colliding(tanker,walls));
} else if (event.key.keysym.sym==SDLK_s){
move_tank_back(tanker,colliding(tanker,walls));
} else if(event.key.keysym.sym==SDLK_d || event.key.keysym.sym==SDLK_a){
turn_tank(event.key.keysym.sym, tanker);
}
}

我正在寻找一种让两个玩家同时玩的方式,因为现在,如果两个玩家都按下向上键和w键,他们都不能移动坦克。

您似乎依赖于操作/窗口系统的按键重复功能,在最初的暂停后以固定的间隔重复上次按下的按键,例如,当您在文本编辑器中保持按键时,它会在一段延迟后开始填充该符号。不过,只重复最后一个键。

使用SDL,您应该知道键盘事件的repeat字段中的键何时重复。然而,您几乎从不希望基于按键事件进行长时间的移动。用你目前的方案,我可以很快按下一个键,坦克会移动得更快,或者我可以修改我的操作系统重复间隔。移动,如果应该是恒定的速度,应该取决于时间,而不是用户按下按钮的速度。这就是为什么你只需要采取任何"好的,按钮A按下,-只要它按下,我将尝试在每个固定的更新间隔向左旋转",当你得到密钥释放事件时,你就放弃了这个意图。

正如Danny_ds所说,使用键状态数组而不是事件通常更容易、更健壮(主要是因为重复)——使用SDL,可以通过SDL_GetKeyboardState获得。制作update_movements或任何函数,并每隔N毫秒调用一次。

在Windows上,您可以使用GetAsyncKeyState()函数。

有关Linux上的等效程序,请参阅此问题。

最新更新