4

我正在构建跨平台游戏引擎,现在我专注于输入系统。

我编写了一个抽象的输入系统,它向上传递消息并由平台相关模块提供,在单独的线程中运行。

在 Windows 中,我创建了“仅消息”窗口,该窗口向输入系统提供来自 RAWINPUT 的消息(转换为与平台无关)。

现在我很难弄清楚如何在基于 unix 的系统上做类似的事情。有什么方便的方法可以从内核获取输入(keyup、keydown、mousemove ...)?或者任何其他不需要显示任何窗口的方式?

编辑

我不希望我的输入系统依赖于我的渲染器。当应用程序焦点发生变化时,渲染器应该只通知输入......所以我希望输入系统在与渲染器不同的线程上运行。

4

3 回答 3

5

通常跨平台输入是通过使用包装库来实现的——SDL在这方面做得很好,当前版本甚至是 BSD 许可的。

使用包装器的优势是如此之大,以至于即使在 Windows 上使用自己的解决方案的 Windows 游戏在 Linux 上运行时也倾向于使用 SDL 作为包装器(这就是创建 SDL 的最初原因)。

因此,在最坏的情况下,您可以将库保留在 Windows 上,并使用 SDL 专门在 *nix 系统上实现。

于 2012-01-30T13:13:19.987 回答
3

假设您使用的是 X11:

Peter Hutterer 有一系列 XInput2 文章。显然支持原始事件。

ManyMouse声称使用 XInput2 没有窗口

  • 在 Unix 系统上,如果可能,我们会尝试使用 XInput2 扩展。如果没有可用的 X 服务器或 X 服务器不支持 XInput2,ManyMouse 将尝试回退到其他方法。如果您想使用 XInput2 目标,请确保使用“-ldl”链接,因为我们使用 dlopen() 来查找 X11/XInput2 库。您不必直接链接到 Xlib,如果最终用户的系统上不存在库,ManyMouse 将正常失败(在 ManyMouse XInput2 驱动程序中报告没有鼠标)。自然,您需要系统上的 X11 标头(在 Ubuntu 上,您需要 apt-get install libxi-dev)。您可以使用定义为零的 SUPPORT_XINPUT2 来构建以完全禁用 XInput2 支持。 请注意,XInput2 目标不需要您的应用程序提供 X11 窗口。只要 X 服务器正在运行,test_manymouse_stdio 应用程序就可以使用此目标。请注意,X11 DGA 扩展与 XInput2 冲突(特别是:SDL 可能会使用它)。这是在 SDL 1.2 中处理此问题的好方法:

可能值得通过源代码查看。

于 2012-01-30T22:43:13.270 回答
0

在 X Window 系统下有一个只输入窗口的概念,它或多或少与 Windows 下的只消息窗口类似。

于 2012-01-30T19:41:36.840 回答