2016-03-02 111 views
1

我试图模拟一个SDL键盘按钮按(使用C)。我已经在线查阅了SDL信息页面,但是我仍然没有任何一贯的工作。模拟键盘按钮按[SDL库]

我有以下(去除中断处理,窗口等创建)

while(1){ 
    SDL_Event user_event; 
    user_event.type = SDL_SCANCODE_LEFT; 

    SDL_PushEvent(&user_event); 
    SDL_PumpEvents(); 

    const Uint8 *state = SDL_GetKeyboardState(NULL); 

    if (state[SDL_SCANCODE_LEFT]) { 
     printf("LEFT PRESSED"); 
    } 
    if (state[SDL_SCANCODE_RIGHT]) { 
     printf("RIGHT PRESSED"); 
    } 
} 

我从来没有看到“按住左键”字符串打印出来,但是当我按下右箭头键(键盘)我看到了相应的输出。看起来像左键按下从不被推入状态变量。

任何帮助将不胜感激。

+0

也许你没有英文键盘和你的扫描码是不同的。尝试使用'SDL_GetScancodeFromKey()'从键码获得扫描码。参考:https://wiki.libsdl.org/SDL_GetScancodeFromKey?highlight=%28%5CbCategoryKeyboard%5Cb%29%7C%28CategoryEnum%29%7C%28CategoryStruct%29 – Lasoloz

+0

事件类型肯定是不正确的,但无论如何 - [文档]( https://wiki.libsdl.org/SDL_PushEvent)明确指出'注意:将设备输入事件推入队列不会修改SDL中设备的状态。 – keltar

回答

2

我不认为它是这样工作的。由SDL_GetKeyboardState()返回的状态数组代表原始键盘的状态,推送事件不会影响(即使键盘输入生成事件)。

但我认为这是可以做到你想要什么,如果你可以使用SDL_PollEvent()代替SDL_PumpEvents()和检查键盘状态阵列,

/* Push a single left key event. */ 
SDL_Event sdlevent = {}; 
sdlevent.type = SDL_KEYDOWN; 
sdlevent.key.keysym.sym = SDLK_LEFT; 
SDL_PushEvent(&sdlevent); 

while (1) { 
    SDL_Event ev; 
    if (SDL_PollEvent(&ev)) { 
     if(ev.type == SDL_KEYDOWN) { 
      if (ev.key.keysym.sym == SDLK_LEFT) { 
       printf("LEFT PRESSED\n"); 
      } 
      if (ev.key.keysym.sym == SDLK_RIGHT) { 
       printf("RIGHT PRESSED\n"); 
      } 
     } 
    } 
} 
+0

这开箱即用。谢谢。 –