【问题标题】:SDL Multiple Key Press IssueSDL 多键按下问题
【发布时间】:2012-12-01 18:11:05
【问题描述】:

我遇到了 SDL 的一个问题 - 同时按下 w a s d 和箭头键 - 在按住 s、d 和 left 和 down 以及 w d 和 up 和 left 键时存在某种不兼容。如果我倾向于使用上面提到的组合,似乎只有 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;
    }
}

这会调用两个函数,从父类重写(在 Core 类中,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;
  }
}

这是如何调用的(在 Core 类中,CEvent 的子级):

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

我只是不知道是什么导致了这个,因为程序循环通过这个直到缓冲区中没有剩余的事件。

【问题讨论】:

  • 我已经看到证据表明不同的键盘在使用相同的软件时表现不同。因此,可以同时按下多少个键盘键是特定于键盘的问题。问问 FPS 游戏玩家,他们知道什么是好的键盘,什么不是。
  • 这是硬件问题。普通键盘会受此影响。有特殊的游戏键盘可以解决这个问题。
  • @ivaylo9603,正如其他人所说,那是关键鬼;您无法修复它,因为这是硬件限制。可以这么说,一些“标准”键盘会在同时按下 3 个以上的键后减少输入(根据我自己的经验)。对于其他提到游戏键盘的人来说——它们绝不是灵丹妙药。他们仍然是有限的。我没有彻底测试过(我拥有一个游戏键盘),但我认为即使他们会同时按下八个按键。
  • 感谢您的建议,不过,我是笔记本电脑用户:/。无论如何,这对我来说并不重要,我认为问题可能出在我的代码中。无论如何谢谢:)
  • 我在使用 SHIFT + SPACE + DOWN 时遇到了类似的问题。我不会将 DOWN 键与 UP 键区别对待,但后者在这个特定的组合键中起作用。如果我先按 DOWN,然后再按另外两个,它就可以了。所以它与你按下什么样的键,以及按什么顺序有关。在 Linux 上使用 SDL2。

标签: c++ events sdl


【解决方案1】:

这可能是此处描述的密钥阻塞现象:http://en.wikipedia.org/wiki/Rollover_(key)#Key_blocking_and_ghosting

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

【讨论】:

  • 所以这不是软件问题。我自己是笔记本电脑用户,我的运气很好。好吧,至少我知道我对此无能为力,希望消费者会更幸运。谢谢你:)
  • @ivaylo9603:嗯,按键重影是 PC 游戏中按键分配应该始终可配置的原因之一。
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-02-20
相关资源
最近更新 更多