1

SDLの問題に遭遇しました-wasキーと矢印キーの両方が同時に押されています-s、d、左と下、およびwdと上と左のキーを押している間、ある種の非互換性があります。上記の組み合わせを使用する傾向がある場合は、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の子であるCoreクラス)からオーバーライドされた2つの関数が呼び出されます。

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();

バッファにイベントがなくなるまでプログラムがこれをループするので、これの原因を理解することはできません。

4

1 に答える 1

2

これは、ここで説明されているキーブロッキング現象である可能性があります:http://en.wikipedia.org/wiki/Rollover_ (key)#Key_blocking_and_ghosting

これについてあなたができることは何もありません。キーボードを変更すると、運が良ければ、キーの組み合わせが異なると問題が発生するキーボード(できれば使用していないキーボード)が見つかる可能性があります。

于 2012-12-01T18:37:18.390 に答える