KeyRelease 事件从未发送

发布于 2024-10-22 02:30:35 字数 1812 浏览 1 评论 0原文

我在捕捉按键释放事件以阻止我的角色在游戏中行走时遇到了一些问题。

我正在尝试这样做:

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),没什么特别的

I'm having a little problem catching a key released event to stop my character from walking in my game..

i'm trying to do this:

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;
    }

But I only get the re-triggered key release events, which I don't want. (even though a release/re-press would have the same result, but in the future it might give problems)
When i physically release the key, no event is caught.

oh, and input->setKey() basically sets a bool to true (or false) in a std::map, nothing special

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

独享拥抱 2024-10-29 02:30:35

这是一个常见的问题。如果您没有注册特定活动(或全部),您将不会收到通知。
我们所有人,无论经历如何,有一天都会陷入困境......:)

一些有用的链接:

This is a common gotcha. If you don't register for specific events (or all), you will not be notified.
All of us, doesn't matter the experience, will fall in this one day... :)

Some usefull links:

御守 2024-10-29 02:30:35

注册 KeyReleaseMask 解决了这个问题。

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

Registering the KeyReleaseMask solved the problem.

XSelectInput(dis, win, KeyPressMask | KeyReleaseMask);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文