SDL 2 Space keydown не обнаружен, но Space keyup работает нормально

Эй, так что я работаю над проектом /2d-игрой, и у меня возникает какое-то странное поведение из SDL, которое, я уверен, вероятно, я не понимаю. Функция ProcessKeys вызывается и отлично работает для всех нажатий клавиш, кроме SDLK_SPACE, и я не могу на всю жизнь выяснить, почему.

Еще более странно, что переключатель SDL_KEYUP SDLK_SPACE отлично работает. Я попытался использовать некоторый код отладки, чтобы распечатать, какая клавиша нажата, и когда вы нажимаете пробел, ничего не регистрируется. Каждый другой ключ на клавиатуре регистрируется в моей инструкции отладки в верхней части случая 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()
{
 ****** start_ticks = SDL_GetTicks();
 TakeInput(this->setup->GetEvent());
 this->keyboard->ProcessKeys(this->setup->GetEvent());
 this->setup->RenderBegin();
 this->ship->drawBackBuffer();
 this->ship->renderSprite();
 ****** end_ticks = SDL_GetTicks();
 int sleep_delay = (1000 / 60) - (end_ticks-start_ticks);

 if (sleep_delay > 0) {
 SDL_Delay(sleep_delay);
 } 
}
1 ответ

Если вы только пишете event->key.keysym.sym на консоли, вы должны знать, что клавиша пробела создает почти невидимый символ.

Попробуйте это вместо этого:

std::cout << "<" << event->key.keysym.sym << ">"

Таким образом, вы можете видеть невидимый символ whataver, заключенный между угловыми скобками.

licensed under cc by-sa 3.0 with attribution.