我有一个小问题,捕捉一个关键释放的事件,以阻止我的角色在我的游戏中行走。
我正在尝试这样做:
switch (xev.type)
{
case Expose:
{
XGetWindowAttributes(dpy, win, &gwa);
glViewport(0, 0, gwa.width, gwa.height);
}
break;
case KeyPress:
{
int key = XLookupKeysym(&xev.xkey, 0);
if (key == XK_Escape)
{
glXMakeCurrent(dpy, None, NULL);
glXDestroyContext(dpy, glc);
XDestroyWindow(dpy, win);
XCloseDisplay(dpy);
running = false;
return 0;
}
else
{
input->setKey(key, true);
}
}
break;
case KeyRelease:
{
unsigned short is_retriggered = 0;
if (XEventsQueued(dpy, QueuedAfterReading))
{
XEvent nev;
XPeekEvent(dpy, &nev);
if (nev.type == KeyPress && nev.xkey.time
== xev.xkey.time && nev.xkey.keycode
== xev.xkey.keycode)
{
// delete retriggered KeyPress event
XNextEvent(dpy, &xev);
is_retriggered = 1;
}
}
if (!is_retriggered)
input->setKey(XLookupKeysym(&xev.xkey, 0), false);
}
break;
}但我只得到重新触发的按键释放事件,这是我不想要的。(即使释放/重新按下也会有相同的结果,但将来可能会出现问题)当我物理释放该键时,没有捕捉到任何事件。
哦,input->setKey()基本上就是在std::map中将bool设置为true (或false),没什么特别的
发布于 2011-03-14 19:06:53
这是一个常见的陷阱。如果您没有注册特定事件(或所有事件),您将不会收到通知。我们所有人,无论经历了什么,都会在这一天坠落...:)
一些有用的完整链接:
发布于 2011-03-12 06:57:33
注册KeyReleaseMask解决了这个问题。
XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);
https://stackoverflow.com/questions/5277885
复制相似问题