没有使用SDL或GLUT,最好的检测按键的方法是什么?

5
我最近使用C++通过OpenGL和GLUT创建了一个小应用程序。一切运作良好,然后我使用帧率等参数实现了适当的游戏循环,这使得很多东西都变得更好了。但是它似乎也破坏了常规的GLUT键盘检测(它似乎从来没有很好地处理游戏键盘输入)。因此,我正在寻找另一种在我的应用程序中进行键盘输入的方法。
请问有人能建议其他(最好是相对容易)的在应用程序中检测按键输入的方法吗?

2
如果您正在使用内置的操作系统 API,我们需要知道您使用的是哪个操作系统(我猜是 Windows?)否则,您可以尝试另一个轻量级库,如 GLFW。 - ravuya
虽然我不喜欢GLUT,但你为什么说GLUT键盘输入不好?GLUT有两种键盘输入模式。一种是像文本编辑器中那样,如果你一直按住一个键,你会周期性地接收到它。另一种方法(用于游戏)是在按下键时通知你(以便更改游戏状态),并在释放键时通知你(以便将状态改回)。第二种方法非常适合游戏。顺便说一句,第二种方法也适用于SDL。我用它写了很多游戏,它们都运行得很好。 - Shahbaz
@Shahbaz,抱歉提到旧评论和帖子,但是freeglut甚至有几个多年未解决的错误,例如按下ctrl +数字根本不会触发键盘回调,没有特殊的键盘回调。您无法区分ctrl-break和ctrl-c,因为它们被报告为相同的ASCII字符...在glut中处理键盘很糟糕。还有其他错误,而这仅限于Windows... https://sourceforge.net/p/freeglut/bugs/ - Unicorn
3个回答

5
现在我正在寻找一种合适的方法来实现应用程序中的键盘输入。但是,你需要考虑不再使用GLUT了。至少在Windows上,获取输入的能力直接与窗口相关。如果你没有任何窗口,你就没有输入(控制台本身就是一个窗口)。更重要的是,如果GLUT拥有你的窗口,那么GLUT决定如何处理该窗口的输入。因此,如果你正在使用GLUT,你必须使用GLUT的输入系统。如果GLUT的输入系统无法满足你的需求,那么就是时候放弃GLUT去寻找更好的选择了。毕竟,GLUT只是为演示而设计的,而不是用于严肃的应用程序。

因此,您需要一个替代GLUT的工具。您可能可以使用GLFW,但这可能对您的游戏不够充分。因此,SDLSFMLAllegro 5都是可能的选择。它们都有生成使用OpenGL的窗口的方法,并且都是跨平台的。所有这些工具都比GLUT具有更有效和灵活的输入系统。


我想我会从GLUT切换到SDL,然后希望只需包含SDL.h并更改几行代码就可以了。 - user354346

2
“没有简单的方法。如果你想从操作系统获取输入,你需要跟踪 Windows 消息,但如果你使用 GLUT,这是不可能的,因为它会为你创建窗口。另外,GLUT 的另一个问题是它并不真正跟踪按下的键,而是跟踪输入的字符,所以按下 num1 和 num1+shift 会生成两个不同的东西,对于每种键盘布局,这些都会不同。如果你想要正确处理键盘输入,请使用 SDL 或更好的 SFML(在 Google 上搜索它 - 简单快速的多媒体库)。它们可以让你跟踪按键。或者,如果你不想使用任何库,你需要自己创建和处理窗口,但这不具备可移植性,除非你为每个平台编写代码。即使你不需要可移植性,使用 win32 编程也很麻烦,你肯定不想那样做。

GLUT 简单来说并不适合游戏开发,我的建议是使用 SFML。


更新: 如果你真的想搞win32(Windows操作系统),假设你知道如何创建和处理窗口,那么Windows发送到窗口的消息是WM_KEYDOWN,按下的键标识符存储在wParam中。您可以在此处找到所有可能的值虚拟键代码

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接