SDL 2 Space keydown未检测到,但Space keyup工作正常
SDL 2 Space keydown not detected but Space keyup works fine
嘿,我正在做一个项目/2d游戏,SDL有一些奇怪的行为,我确信这可能是我不理解的。函数ProcessKeys被调用,除了SDLK_SPACE之外,它在所有按键按下时都能正常工作,我一辈子都想不出原因。
更奇怪的是SDLK_SPACE的SDL_KEYUP开关工作得很好。我试着用一些调试代码打印出按下了哪个键,当你按下空格时,没有任何寄存器。键盘上的每个其他键都会在SDL_KEYDOWN案例顶部的调试语句中注册。
如果有人能看到正在发生的事情,我将非常感激。
如果你想知道它的名字在哪里,请告诉我。
SDLKeyboard::KeyState SDLKeyboard::ProcessKeys(SDL_Event * event)
{
switch(event->type)
{
/* Look for a keypress */
case SDL_KEYDOWN:
{
std::cout << "Key currently pressed" << event->key.keysym.sym << std::endl;
/* Check the SDLKey values and move change the coords */
switch(event->key.keysym.sym)
{
case SDLK_LEFT:
{ // rotate the ship left
c.setIsTurningLeft(true);
return this->keystate = LeftPressed;
// add code when user presses left
break;
}
case SDLK_RIGHT:
{
// rotate the ship right
c.setIsTurningRight(true);
return this->keystate = RightPressed;
// add code when user presses right
break;
}
case SDLK_UP:
{
// accleration
c.setIsAccelerating(true);
return this->keystate = UpPressed;
// add code when user presses up
break;
}
case SDLK_SPACE:
{
// shoot
c.setIsShooting(true);
std::cout << "keystate = " << this->keystate;
return this->keystate = SpacePressed;
// add code when user presses space
break;
}
default:
{
return this->keystate = NotPressed;
break;
}
}
break;
}
/* We must also use the SDL_KEYUP events to zero the x */
/* and y velocity variables. But we must also be */
/* careful not to zero the velocities when we shouldn't*/
case SDL_KEYUP:
{
std::cout << "Key currently pressed" << event->key.keysym.sym << std::endl;
switch(event->key.keysym.sym)
{
case SDLK_LEFT:
{ /* We check to make sure the ship is moving */
/* to the left. If it is then we zero the */
/* velocity. If the ship is moving to the */
/* right then the right key is still press */
/* so we don't touch the velocity */
c.setIsTurningLeft(false);
return this->keystate = LeftReleased;
// code to do things when left isn't pushed anymore but still moving left
break;
}
case SDLK_RIGHT:
{ // code to do things when right isn't pushed anymore but still moving right
c.setIsTurningRight(false);
return this->keystate = RightReleased;
break;
}
case SDLK_UP:
{ // code to do things when up isn't pushed anymore but still moving up
c.setIsAccelerating(false);
return this->keystate = UpReleased;
break;
}
case SDLK_SPACE:
{ // accleration
c.setIsShooting(false);
return this->keystate = SpaceReleased;
// add code when user presses up
break;
}
default:
break;
}
break;
}
default:
{
return this->keystate = NotPressed;
break;
}
}
}
编辑:
以下是请求的示例。我注意到的另一件事是,响应的延迟并没有那么大。就像你按下一个键,有时控制台不会打印相应的键。可能也和我的空间问题有关。
void GUI::TakeInput(SDL_Event *e)
{
while (SDL_PollEvent(e))
OnEvent(e);
}
void SDLEvent::OnEvent(SDL_Event * event)
{
switch(event->type)
{
case SDL_KEYDOWN:
{
OnKeyDown(event->key.keysym.sym);
break;
}
case SDL_KEYUP:
{
OnKeyUp(event->key.keysym.sym);
break;
}
case SDL_MOUSEMOTION:
{
OnMouseMove(event->motion.x,event->motion.y);
break;
}
case SDL_MOUSEBUTTONDOWN:
{
OnMouseButtonDown(event->button.button, event->button.x,event->button.y);
break;
}
case SDL_MOUSEBUTTONUP:
{
OnMouseButtonUp(event->button.button, event->button.x,event->button.y);
break;
}
case SDL_QUIT: {
OnExit();
break;
}
case SDL_SYSWMEVENT: {
//Ignore
break;
}
case SDL_WINDOWEVENT_RESIZED: {
OnResize();
break;
}
case SDL_WINDOWEVENT_EXPOSED: {
OnExpose();
break;
}
default: {
OnUser(event->user.type,event->user.code,event->user.data1,event->user.data2);
break;
}
}
}
void GUI::Play()
{
Uint32 start_ticks = SDL_GetTicks();
TakeInput(this->setup->GetEvent());
this->keyboard->ProcessKeys(this->setup->GetEvent());
this->setup->RenderBegin();
this->ship->drawBackBuffer();
this->ship->renderSprite();
Uint32 end_ticks = SDL_GetTicks();
int sleep_delay = (1000 / 60) - (end_ticks-start_ticks);
if (sleep_delay > 0) {
SDL_Delay(sleep_delay);
}
}
如果您只是在控制台上编写event->key.keysym.sym
,您应该知道空格键会产生一个几乎不可见的字符。
试试这个:
std::cout << "<" << event->key.keysym.sym << ">"
所以你可以看到打印在尖括号之间的不可见字符。
相关文章:
- 从 MSVC14 切换到 MSVC16 会导致"compiler is out of heap space (C1060)"错误
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- boost :: filesystem :: space()报告错误的磁盘空间
- 模块名称是否驻留在单独的"name space"中,或者它们可能与例如变量名称发生冲突?
- 将Space分离的值文本转换为使用C 的.CSV,然后保存
- 调试"Invalid address space"错误
- 如何使用 c++ 从 stdin int 读取 跳过","和"Space"直到"n"
- SDL 2 Space keydown未检测到,但Space keyup工作正常
- 删除密钥未触发 KeyUp 和 KeyDown 事件
- 对未定义的C++班次操作员行为和换行"pattern space"感到困惑
- 如何将"Alt+space"热键绑定到Qt中的插槽?
- 在字符串中查找'space'字符时出错
- 如何删除 Ucrustify "tab tab SPACE"中的空格 - 缩进?
- 字符串类型从用户获取输入'space'
- RapidXML 是否支持 xml:space= "preserve" ?
- C++ 'Using space as a delimiter'
- white space and makefile
- 全局热键释放(keyup)?(WIN32 API)
- 如何在类声明范围内使用“using space::function”