我正在构建跨平台游戏引擎,现在我专注于输入系统。
我写了一个抽象的输入系统来传递消息 并且由平台相关模块提供,在单独的线程中运行。
在Windows中,我创建了“仅消息”窗口,该窗口提供输入 系统与RAWINPUT的消息(转换为平台无关)。
现在我在基于unix的系统上弄清楚如何做类似的事情时遇到了麻烦。 有没有方便的方法从内核获取输入(keyup,keydown,mousemove ...)? 或者任何其他方式,而不需要显示任何窗口?
修改
我不希望我的输入系统依赖于我的渲染器。渲染器应该通知 应用程序焦点更改时输入...所以我希望输入系统在与渲染器不同的线程上运行。
答案 0 :(得分:5)
通常使用包装器库实现跨平台输入 - SDL是非常好的,当前版本甚至是BSD许可。
使用包装器的优势是如此之大,即使在Windows上使用自己的解决方案的Windows游戏也倾向于在Linux上运行时使用SDL作为包装器(这是SDL创建的原始原因)。
因此,在最坏的情况下,您可以将您的库保留在Windows上,并使用SDL专门用于* nix系统。
答案 1 :(得分:3)
假设你正在使用X11:
Peter Hutterer有series of XInput2 articles。显然支持raw events。
ManyMouse claims to use XInput2 without a window:
- 在Unix系统上,我们尽可能尝试使用XInput2扩展。 如果没有X服务器,ManyMouse将尝试回退到其他方法 可用或X服务器不支持XInput2。如果你想使用 XInput2目标,请确保链接“-ldl”,因为我们使用dlopen() 找到X11 / XInput2库。您不必链接Xlib 直接,而ManyMouse将优雅地失败(报告没有鼠标 ManyMouse XInput2驱动程序)如果最终用户的库不存在 系统。当然,你需要系统上的X11接头(在Ubuntu上, 你想要apt-get install libxi-dev)。你可以用 SUPPORT_XINPUT2定义为零以完全禁用XInput2支持。 请注意,XInput2目标不需要您的应用提供X11 window. test_manymouse_stdio应用程序适用于此目标,只要 X服务器正在运行。请注意,X11 DGA扩展与 XInput2(具体来说:SDL可能会使用它)。这是一个很好的处理方式 这在SDL 1.2中:
可能值得查看来源。
答案 2 :(得分:0)
在X Window系统下,有一个仅输入窗口的概念,它或多或少与Windows下的仅消息窗口的窗口并行。