Keyboard 操作系统和实现对键盘的独立访问?

Keyboard 操作系统和实现对键盘的独立访问?,keyboard,cross-platform,scancodes,Keyboard,Cross Platform,Scancodes,我用MSVC++制作了一个FPS游戏,在Windows上运行得很好。但现在我正试图使其可移植(至少我想创建一个linux和Windows版本),所以我决定将IDE更改为Code::Blocks,将框架更改为wxWidgets。但在不同的系统上,虚拟钥匙代码和扫描代码似乎是不同的 早些时候,我曾体验到,即使在同一个操作系统上,但在不同的计算机上,虚拟键码也可能不同(我收到了错误报告,说虚拟键码无法控制角色(取决于numlock状态,lol,而不是玩笑),当将代码更改为使用扫描码而不是virtkey

我用MSVC++制作了一个FPS游戏,在Windows上运行得很好。但现在我正试图使其可移植(至少我想创建一个linux和Windows版本),所以我决定将IDE更改为Code::Blocks,将框架更改为wxWidgets。但在不同的系统上,虚拟钥匙代码和扫描代码似乎是不同的

早些时候,我曾体验到,即使在同一个操作系统上,但在不同的计算机上,虚拟键码也可能不同(我收到了错误报告,说虚拟键码无法控制角色(取决于numlock状态,lol,而不是玩笑),当将代码更改为使用扫描码而不是virtkey代码时,这是固定的) (编辑:使用wxWidgets时,numpad上的virtkey和扫描代码都有不同的值,具体取决于numlock状态,bang!)

现在有了wxWidgets,wxKeyEvent::GetRawKeyCode和之前从WM_KEYDOWN的LPRAM获得的代码似乎有所不同。我在linux(ubuntu)上也得到了与GetRawKeyCode完全不同的扫描代码

嗯,我可以通过按下所有键并查看它给出的代码来创建自己的扫描代码表,但唯一的问题是ubuntu在我的笔记本电脑上运行,而笔记本电脑没有完整的键盘。。。 但我需要所有这些来让控制设置工作


因此,问题是:是否有一种标准的跨平台方法可以为同一把钥匙获得相同的代码(更准确地说,钥匙位于同一位置)?(至少在windows和linux上)

如果您还没有考虑过,您可能可以使用它。

这是一个FPS,您使用的较低级别的图形工具包会产生巨大的差异(我假设您不是在wxWidgets中编写3d图形)。如果您使用的是OpenGL,您是否了解了它的功能

与结合的and可以用于跨平台键盘代码,GLUT甚至可以用于其他输入设备


但老实说,我仍然不明白这与wxWidgets有什么关系。

我的观点是,使用wxWidgets编写快节奏的3D游戏是完全错误的。在“硬核”游戏开发中,您应该使用它来开发支持工具,例如编辑器和转换器

这是一条路要走。这可能看起来很基本,但一旦你开始把小孩子牺牲给SDL的邪恶之神,比如(非常适合阅读多种图像文件格式——在某种程度上,我有时只使用SDL阅读例如JPEG)或(阅读和播放基本音频所需的唯一解决方案——OGG、WAV等等)

因此,请看SDL。一旦开始使用SDL_gfx,即使2D图形支持也很好。SDL一开始可能看起来很基本,但一旦你计算了围绕它构建的所有额外库,并围绕它编写了一些包装,你就会发现SDL是基本必需品和高级使用方便性之间的完美平衡


我很乐意为您提供SDL方面的任何帮助,因为我觉得它非常棒。

我可能低估了您在这里看到的内容,但是查看将导致硬件、操作系统、配置和平台的差异,因此您应该仔细查看

编辑:可能就是处理得不对(值得怀疑)。 numlock键的问题是通过使用原始扫描代码“强制”您解决这个问题(很糟糕)


如果是这样的话,你不需要扔掉你所做的,但是如果你只为输入内容添加,你会发现返回的调用不仅返回硬件扫描码(你不能做任何“修复”),而且还映射到一个unicode字符和一个虚拟符号,我想这就是你要找的。希望他们的呼叫没有这个numlock修饰符问题。

如果你不想使用SDL,我建议。 它是多平台的,使用起来非常简单。例如,来自:

输入在哪里

const sf::Input& Input = App.GetInput();

有人说SFML比SDL快,但我倾向于使用它来快速生成可移植的代码,因为我更喜欢它的用法,而不是SDL。

Ubuntu不是unix。它是linux。这是有区别的。但是它是基于unix的。。。(当然是后期编辑)避免使用该参数,并将其称为GNU。请参阅Ceci nes pas un随机强调命名断言。添加链接将使此答案更加有用。我已经制作了扫描代码表(我下载了几个屏幕键盘并获得了所需的所有代码)。但是,它以30帧(预设)的速度运行,没有人说它不起作用。我只是觉得wxWidgets对OpenGL的支持并不是为了实现这一点。它是为需要3D支持的应用而设计的,而不是需要窗口支持的3D游戏,如果你在关注我的话。感谢你指出SFML,我很高兴知道SDL的替代方案!也就是说,您指出的这些基准是指SFML比SDL更快。。。在执行普通2D渲染时。这个问题涉及3D渲染:再次,感谢指出SFML,我会考虑它在工作2D!
const sf::Input& Input = App.GetInput();