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

时间:2009-03-07 11:24:54

标签: keyboard cross-platform scancodes

我用MSVC ++做了一个FPS游戏,它在Windows上运行得非常好。但现在我试图让它可移植(至少我想创建一个Linux和Windows版本),所以我决定将IDE更改为Code :: Blocks,将框架更改为wxWidgets。但似乎虚拟键码和扫描码在不同系统上是不同的。

之前我曾经历过,即使在同一个操作系统上,虚拟键码也可能不同但计算机不同(我收到了关于他们无法控制角色的bug报告(取决于numlock状态,lol,而不是笑话),这是固定的更改代码以使用扫描码而不是virtkey代码时 (编辑:使用wxWidgets numpad上的virtkey和scan代码根据numlock状态有不同的值,砰!)

现在使用wxWidgets看起来wxKeyEvent :: GetRawKeyCode和之前从WM_KEYDOWN的lParam获得的代码是不同的。我还从GetRawKeyCode获得了一个完全不同的linux(ubuntu)扫描代码。

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

所以问题:是否有一种标准的跨平台方式来获得相同密钥的相同代码(相同位置的密钥更精确)? (至少在Windows和Linux上)

5 个答案:

答案 0 :(得分:7)

如果您尚未考虑,可以使用SDL

答案 1 :(得分:1)

这是一个FPS,你正在使用的低级图形工具包产生了巨大的差异(我假设你没有在wxWidgets中编写3d图形)。如果你正在使用OpenGL,你看过GLUT可以做什么吗?

glutKeyboardFuncglutSpecialFuncglutGetModifiers相结合可能足以支持跨平台键盘代码,而GLUT甚至可以用于其他输入设备。

说实话,我仍然没有看到这可能与wxWidgets有什么关系。

答案 2 :(得分:1)

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

SDL是要走的路。它似乎很基本,但是一旦你开始牺牲小孩子到SDL的邪恶之神,像SDL_image这样的东西(非常适合阅读大量的图像文件格式 - 在某种程度上我有时只使用SDL来阅读例如JPEG)或SDL_mixer(阅读和播放基本音频所需的唯一解决方案 - OGG,WAV,......)。

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

我很乐意以任何方式帮助您使用SDL,因为我发现它非常棒。

答案 3 :(得分:1)

我可能误解了你在这里看到的内容,但是看raw keycode returned会导致硬件,操作系统,配置和平台差异,所以你应该用virtual keycode returned看{ {3}}

编辑:也许key event只是没有处理它(怀疑)。 numlock键的问题是“强迫”你使用原始扫描代码解决这个问题(不好)。

如果是这种情况,您不需要丢弃已完成的操作,但如果仅为输入内容添加wxWidgets,则会发现返回SDL的电话我只是返回硬件扫描码(你无法对“修复”做什么),还要将它映射到unicode字符和虚拟符号,这就是我想你要找的东西。希望他们的调用没有这个numlock修饰符问题。

答案 4 :(得分:0)

如果您不想使用SDL,我建议SFML - Simple and Fast Multimedia Library。 它是多平台的,使用起来非常简单。例如,来自tutorials section

bool         LeftKeyDown     = Input.IsKeyDown(sf::Key::Left);
bool         RightButtonDown = Input.IsMouseButtonDown(sf::Mouse::Right);
bool         Joy0Button1Down = Input.IsJoystickButtonDown(0, 1);
unsigned int MouseX          = Input.GetMouseX();
unsigned int MouseY          = Input.GetMouseY();
float        Joystick1X      = Input.GetJoystickAxis(1, sf::Joy::AxisX);
float        Joystick1Y      = Input.GetJoystickAxis(1, sf::Joy::AxisY);
float        Joystick1POV    = Input.GetJoystickAxis(1, sf::Joy::AxisPOV);

输入

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

some indications SFML比SDL更快,但是我倾向于使用它来制作快速且可移植的代码,因为我喜欢它的用法而不是SDL。