我正在 SDL 中试验 2D 游戏中的动作,效果很好。然而,当我添加角色通过按 进行射击的可能性时SPACE,我遇到了一个奇怪的错误:如果已经按下了向下和向右键或向上和向左键,则按 时不会创建任何事件SPACE。在其他情况下,会按其应有的方式创建事件。
这是我用来获取一些事件的循环:
while (on == 1)
{
SDL_PollEvent(&event);
switch (event.type)
{
case SDL_KEYDOWN:
switch (event.key.keysym.sym)
{
case SDLK_ESCAPE:
on = 0;
break;
case SDLK_UP:
shooter1.dir[0] = 1; // shooter1 is an instance of a structure that
// contains a position and an array representing
// 4 directions (down, up, left, right)
break;
case SDLK_DOWN:
shooter1.dir[1] = 1;
break;
case SDLK_LEFT:
shooter1.dir[2] = 1;
break;
case SDLK_RIGHT:
shooter1.dir[3] = 1;
break;
case SDLK_SPACE: // Eventually, the program does not go in this
// case, even though the SPACE key is pressed
fprintf(stderr, "SPACE PRESSED\n");
break;
default:
break;
}
break;
case SDL_KEYUP:
switch (event.key.keysym.sym)
{
case SDLK_UP:
shooter1.dir[0] = 0;
break;
case SDLK_DOWN:
shooter1.dir[1] = 0;
break;
case SDLK_LEFT:
shooter1.dir[2] = 0;
break;
case SDLK_RIGHT:
shooter1.dir[3] = 0;
break;
default:
break;
}
break;
default:
break;
}
event.type = 0;
get_new_positions(&shooter1);
SDL_BlitSurface(background, NULL, screen, &background_pos);
blit_shooter(screen, &shooter1);
SDL_Flip(screen);
}
Run Code Online (Sandbox Code Playgroud)
知道这种行为是由于什么造成的吗?
这几乎肯定是硬件限制。引用相关维基百科页面,强调:
某些高端键盘具有“n 键无冲突”。这意味着键盘硬件完全独立地扫描每个按键,因此无论当时按下或按住了多少个其他按键,每次按键都会被正确检测到。[...]
然而,为了降低成本和设计复杂性,大多数计算机键盘并不以这种方式隔离所有按键。相反,他们使用按键开关矩阵,没有任何隔离二极管,假设在任何给定时间只有有限数量的按键被按下。使用这些键盘时,只需按三个键就可能会导致重影效果,尽管在布局矩阵排列时要小心,以免常见的修饰键组合出现这种情况。