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();
バッファにイベントがなくなるまでプログラムがこれをループするので、これの原因を理解することはできません。