SDL 多键按下问题

SDL Multiple Key Press Issue

本文关键字:问题 SDL      更新时间:2023-10-16

>我在使用 SDL 时遇到了一个问题 - 同时按下 w a s d 和箭头键 - 按住 s、d 和左键以及 w d 和向上和左键时存在某种不兼容。如果我倾向于使用上面提到的组合,似乎只有 3 个键有效,否则,任何其他超过 3 个键的组合都工作得很好。代码如下:事件检查(在类 CEvent 中,调用子函数)

switch(Event->type) {
    case SDL_KEYDOWN: {//KEYBOARD_KEYDOWN
        onKeyDown(Event->key.keysym.sym,Event->key.keysym.mod,Event->key.keysym.unicode);
        break;
    }
    case SDL_KEYUP: {//KEYBOARD_KEYUP
        onKeyUp(Event->key.keysym.sym,Event->key.keysym.mod,Event->key.keysym.unicode);
        break;
    }
}

这调用了两个函数,从父类(在类核心中,CEvent 的子类)覆盖:

void Core::onKeyDown(SDLKey sym, SDLMod mod, Uint16 unicode) {
    switch(sym) {
      //pl1
        case SDLK_UP: pl1.pmu = true; break;
        case SDLK_RIGHT: pl1.pmr = true; break;
        case SDLK_DOWN: pl1.pmd = true; break;
        case SDLK_LEFT: pl1.pml = true; break;
      //pl2
        case 'w': pl2.pmu = true; break;
        case 'd': pl2.pmr = true; break;
        case 's': pl2.pmd = true; break;
        case 'a': pl2.pml = true; break;
      case SDLK_ESCAPE: onExit(); break;
  }
}
void Core::onKeyUp(SDLKey sym, SDLMod mod, Uint16 unicode) {
  switch(sym) {
    //pl1
    case SDLK_UP: pl1.pmu = false; break;
    case SDLK_RIGHT: pl1.pmd = false; break;
    case SDLK_DOWN: pl1.pml = false; break;
    case SDLK_LEFT: pl1.pmr = false; break;
    //pl2
    case 'w': pl2.pmu = false; break;
    case 'd': pl2.pmr = false; break;
    case 's': pl2.pmd = false; break;
    case 'a': pl2.pml = false; break;
  }
}

这是如何称呼的(在类核心中,CEvent 的子级):

while( Running ) {
  FPS_START = SDL_GetTicks();
  while( SDL_PollEvent( &Eventhn ) ) {
    onEvent( &Eventhn );
  }
  onLoop();
  onRender();
  regulateFPS();
}
onCleanup();

我只是无法弄清楚是什么原因造成的,因为程序会循环通过它,直到缓冲区中没有剩余的事件。

这可能是这里描述的关键阻塞现象:http://en.wikipedia.org/wiki/Rollover_(key)#Key_blocking_and_ghosting

对此你无能为力。如果您更换键盘,您可能会很幸运地发现一个不同的键组合有问题的键盘(希望是您不使用的键盘)。