我遇到了SDL的问题 - 同时按下了箭头键和箭头键 - 在按住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;
}
}
这会调用两个函数,从父类重写(在类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();
我无法弄清楚导致这种情况的原因,因为程序会循环显示,直到缓冲区中没有剩余事件为止。
答案 0 :(得分:2)
这可能是此处描述的关键阻止现象:http://en.wikipedia.org/wiki/Rollover_(key)#Key_blocking_and_ghosting
你无能为力。如果你更换键盘,你可能会很幸运,找到一个有不同组合键的问题(希望是你没有使用过的键)。