我正在用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);
}
知道这种行为是由什么引起的?
答案 0 :(得分:4)
这几乎肯定是硬件限制。引自the relevant Wikipedia page,重点补充:
某些高端键盘具有“n键翻转”。这意味着每个键都由键盘硬件完全独立扫描,因此无论有多少其他键,都能正确检测每个按键当时正在被按下或按下[...]
但是,为了降低成本和设计复杂性,大多数计算机键盘都不会以这种方式隔离所有键。相反,它们使用了一个没有任何隔离二极管的按键开关矩阵,假设在任何给定时间只能按下有限数量的按键。使用这些键盘,按下很少有三个键会导致重影效果,但在布置矩阵排列时要小心,这对于常见的修饰键组合不会发生。