我用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上)

有帮助吗?

解决方案

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

其他提示

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

glutKeyboardFunc glutSpecialFunc glutGetModifiers 可能足以支持跨平台键盘代码,而GLUT甚至可以用于其他输入设备。

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

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

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

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

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

我可能误解了你在这看到的内容,但是看了返回的原始密码会导致硬件,操作系统,配置和平台差异,因此您应该查看虚拟键码由关键事件返回。

编辑:也许 wxWidgets 只是没有正确处理(可疑)。 numlock键的问题是“强制”键。你可以使用原始扫描码解决这个问题。(

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

如果您不想使用SDL,我建议 SFML - 简单快速的多媒体库。 它是多平台的,使用起来非常简单。例如,从教程部分

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();

有一些一些迹象表明SFML比SDL,但我倾向于使用它来制作快速和可移植的代码,因为我喜欢它的用法而不是SDL。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top