如果向下+向右或向上+向左按下,则没有空格键的SDL事件

时间:2017-07-26 15:26:04

标签: c sdl

我正在用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);
}

知道这种行为是由什么引起的?

1 个答案:

答案 0 :(得分:4)

这几乎肯定是硬件限制。引自the relevant Wikipedia page,重点补充:

  

某些高端键盘具有“n键翻转”。这意味着每个键都由键盘硬件完全独立扫描,因此无论有多少其他键,都能正确检测每个按键当时正在被按下或按下[...]

     

但是,为了降低成本和设计复杂性,大多数计算机键盘都不会以这种方式隔离所有键。相反,它们使用了一个没有任何隔离二极管的按键开关矩阵假设在任何给定时间只能按下有限数量的按键。使用这些键盘,按下很少有三个键会导致重影效果,但在布置矩阵排列时要小心,这对于常见的修饰键组合不会发生。