按下键时SDL2无法获得鼠标输入
SDL2 can't get mouse input when key is depressed
如果按下某个键,我的 SDL2 程序将忽略鼠标单击。这是我的 MCVE:
#include <SDL.h>
void myEventHandler(bool& mouseClicked, bool& letsQuit)
{
SDL_Event event;
while (SDL_PollEvent(&event))
switch (event.type)
{
case SDL_QUIT: letsQuit = true; break;
case SDL_MOUSEBUTTONDOWN: mouseClicked = true;
}
}
int main(int argc, char** argv)
{
//Init SDL
SDL_Window* sldWindow;
SDL_Renderer* sdlRenderer;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
return -1;
if (!(sldWindow = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,640, 480, 0)))
return -1;
if (!(sdlRenderer = SDL_CreateRenderer(sldWindow, -1, 0)))
return -1;
SDL_ClearError();
//Initialize some conditions
bool letsDrawRed= true; //Draw a red square, not blue
bool letsQuit = false; //Quit the program
while (! letsQuit)
{
SDL_RenderPresent(sdlRenderer);
//static int framesSinceLastMouseClick = 0; //latency
bool mouseClicked = false;
myEventHandler (mouseClicked, letsQuit);
if (letsDrawRed) SDL_SetRenderDrawColor(sdlRenderer, 255, 0, 0, 255); //draw square as red
else SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 255, 255); //else draw it blue
static SDL_Rect rect = { 0, 0, 100, 100 }; //draw the square
SDL_RenderFillRect(sdlRenderer, &rect);
//if clicked, and enough time since last click...
//(All of these commented-out conditions fail too)
//if (framesSinceLastMouseClick > 600 && mouseClicked)
//if (framesSinceLastMouseClick > 600 && SDL_GetMouseState(NULL, NULL))
//if (mouseClicked)
if (SDL_GetMouseState(NULL,NULL))
{
//framesSinceLastMouseClick = 0;
letsDrawRed = !letsDrawRed;
}
//else ++framesSinceLastMouseClick;
}
SDL_DestroyWindow(sldWindow);
SDL_Quit();
return 0;
}
我在评论中留下了一些东西来表明它们不是问题所在。一种是延迟条件 (framesSinceLastMouseClick
)。另一个是从 SDL_PollEvent
获取鼠标事件而不是调用 SDL_GetMouseState
。)
另一件需要注意的事情是 只有当按下的键可打印时才会出现问题。 CapsLock、Shift、Alt、Ctrl 和功能键不会造成问题。
MS Windows 上的平台是 Visual Studio。
所以...我怎样才能在按下某个键时找到那个鼠标?在真正的游戏中这将是一个问题!
事实证明这不是 SDL 问题,而是我使用的计算机问题,它无法在按下可打印字符时从鼠标(实际上是触控板)发送信息。显然,从键盘发送多个信号是一个长期存在的问题,结果 "keyboard ghosting"(一些键——在我的例子中,触控板点击——丢失)。
在发布时,我能够检查我的 keyboard/trackpad 可以在 https://keyboardtester.co/mouse-click-tester.html 发送什么输出。
如果按下某个键,我的 SDL2 程序将忽略鼠标单击。这是我的 MCVE:
#include <SDL.h>
void myEventHandler(bool& mouseClicked, bool& letsQuit)
{
SDL_Event event;
while (SDL_PollEvent(&event))
switch (event.type)
{
case SDL_QUIT: letsQuit = true; break;
case SDL_MOUSEBUTTONDOWN: mouseClicked = true;
}
}
int main(int argc, char** argv)
{
//Init SDL
SDL_Window* sldWindow;
SDL_Renderer* sdlRenderer;
if (SDL_Init(SDL_INIT_EVERYTHING) < 0)
return -1;
if (!(sldWindow = SDL_CreateWindow("", SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,640, 480, 0)))
return -1;
if (!(sdlRenderer = SDL_CreateRenderer(sldWindow, -1, 0)))
return -1;
SDL_ClearError();
//Initialize some conditions
bool letsDrawRed= true; //Draw a red square, not blue
bool letsQuit = false; //Quit the program
while (! letsQuit)
{
SDL_RenderPresent(sdlRenderer);
//static int framesSinceLastMouseClick = 0; //latency
bool mouseClicked = false;
myEventHandler (mouseClicked, letsQuit);
if (letsDrawRed) SDL_SetRenderDrawColor(sdlRenderer, 255, 0, 0, 255); //draw square as red
else SDL_SetRenderDrawColor(sdlRenderer, 0, 0, 255, 255); //else draw it blue
static SDL_Rect rect = { 0, 0, 100, 100 }; //draw the square
SDL_RenderFillRect(sdlRenderer, &rect);
//if clicked, and enough time since last click...
//(All of these commented-out conditions fail too)
//if (framesSinceLastMouseClick > 600 && mouseClicked)
//if (framesSinceLastMouseClick > 600 && SDL_GetMouseState(NULL, NULL))
//if (mouseClicked)
if (SDL_GetMouseState(NULL,NULL))
{
//framesSinceLastMouseClick = 0;
letsDrawRed = !letsDrawRed;
}
//else ++framesSinceLastMouseClick;
}
SDL_DestroyWindow(sldWindow);
SDL_Quit();
return 0;
}
我在评论中留下了一些东西来表明它们不是问题所在。一种是延迟条件 (framesSinceLastMouseClick
)。另一个是从 SDL_PollEvent
获取鼠标事件而不是调用 SDL_GetMouseState
。)
另一件需要注意的事情是 只有当按下的键可打印时才会出现问题。 CapsLock、Shift、Alt、Ctrl 和功能键不会造成问题。
MS Windows 上的平台是 Visual Studio。
所以...我怎样才能在按下某个键时找到那个鼠标?在真正的游戏中这将是一个问题!
事实证明这不是 SDL 问题,而是我使用的计算机问题,它无法在按下可打印字符时从鼠标(实际上是触控板)发送信息。显然,从键盘发送多个信号是一个长期存在的问题,结果 "keyboard ghosting"(一些键——在我的例子中,触控板点击——丢失)。
在发布时,我能够检查我的 keyboard/trackpad 可以在 https://keyboardtester.co/mouse-click-tester.html 发送什么输出。