3

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

早些时候我经历过,即使在相同的操作系统但不同的计算机上,虚拟键码也可能不同(我收到关于他们无法控制角色的错误报告(取决于 numlock 状态,哈哈,不是开玩笑),这在更改时已修复使用扫描码而不是 virtkey 码的代码)(编辑:使用 wxWidgets,小键盘上的 virtkey 和扫描码都有不同的值,具体取决于 numlock 状态,砰!)

现在使用 wxWidgets 似乎 wxKeyEvent::GetRawKeyCode 和之前从 WM_KEYDOWN 的 lParam 获得的代码是不同的。而且我还从 GetRawKeyCode 在 linux (ubuntu) 上获得了完全不同的扫描代码。

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

那么问题来了:是否有一种标准的跨平台方式来为同一个键(更准确地说是同一个位置的键)获取相同的代码?(至少在 Windows 和 linux 上)

4

5 回答 5

7

如果您还没有考虑过,您也许可以使用SDL

于 2009-03-07T13:43:13.433 回答
1

这是一个 FPS,您使用的较低级别的图形工具包有很大的不同(我假设您不是在 wxWidgets 中编写 3d 图形)。如果您使用的是 OpenGL,您是否看过GLUT可以做什么?

glutKeyboardFunc和glutSpecialFunc与glutGetModifiers相结合对于跨平台键盘代码来说已经足够了,GLUT 甚至可以用于其他输入设备。

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

于 2009-03-10T19:45:01.463 回答
1

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

SDL是要走的路。它可能看起来很基本,但是一旦您开始将小孩牺牲给 SDL 的邪恶之神,诸如SDL_image(非常适合读取多种图像文件格式 - 在某种程度上我有时仅使用 SDL 来读取例如 JPEG)或SDL_mixer(唯一的解决方案)您需要阅读和播放基本音频 - OGG、WAV、...)。

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

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

于 2009-03-14T10:35:07.760 回答
1

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

编辑:也许wxWidgets只是没有正确处理它(可疑)。numlock 键的问题是“迫使”您通过使用原始扫描代码来解决这个问题(很差)。

如果是这种情况,您不需要丢弃您所做的事情,但是如果您仅为输入内容添加SDL ,您会发现返回SDL_keysym的调用不只是返回硬件扫描码(您可以什么都不做“修复”),但也将它映射到一个 unicode 字符和一个虚拟符号,我认为这是你正在寻找的。希望他们的电话没有这个数字锁定修饰符问题。

于 2009-03-15T09:08:03.087 回答
0

如果你不想使用 SDL,我推荐SFML - Simple and Fast Multimedia Library。它是多平台的,使用起来非常简单。例如,从教程部分

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。

于 2009-03-16T18:33:23.390 回答