如果已按下向下+向右或向上+向左,则不会发生空格键按下的 SDL 事件

nou*_*oir 4 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);
}
Run Code Online (Sandbox Code Playgroud)

知道这种行为是由于什么造成的吗?

Cha*_*ffy 5

这几乎肯定是硬件限制。引用相关维基百科页面,强调:

某些高端键盘具有“n 键无冲突”。这意味着键盘硬件完全独立地扫描每个按键,因此无论当时按下或按住了多少个其他按键,每次按键都会被正确检测到。[...]

然而,为了降低成本和设计复杂性,大多数计算机键盘并不以这种方式隔离所有按键。相反,他们使用按键开关矩阵,没有任何隔离二极管,假设在任何给定时间只有有限数量的按键被按下。使用这些键盘时,只需按三个键就可能会导致重影效果,尽管在布局矩阵排列时要小心,以免常见的修饰键组合出现这种情况。

  • “幽灵”一词(写在您共享的维基百科页面中)让我感兴趣,因此我在互联网上搜索并发现了一些也有助于理解我面临的问题的内容:https://www.microsoft.com/appliedsciences/antighostingexplained。毫秒 (2认同)