2009-03-07 29 views
3

我用MSVC++制作了一款FPS游戏,在Windows上运行得非常好。但现在我试图使它可移植(至少我想创建一个Linux和Windows版本),所以我决定将IDE更改为Code :: Blocks和框架wxWidgets。但似乎虚拟键码和扫描码在不同的系统上是不同的。 (我得到了关于它们无法控制字符(取决于numlock状态,lol,而不是笑话)的错误报告,这是因为它们是不同的固定时更改代码以使用扫描码,而不是VIRTKEY代码) (编辑:!与wxWidgets的两个VIRTKEY和扫描码的数字键盘具有根据numlock的状态不同的值,砰) 操作系统和实现独立访问键盘?

与wxWidgets的

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

嗯,我可以通过按所有键,看看它给出了什么代码,但唯一的问题是Ubuntu的笔记本电脑上运行,而笔记本电脑没有一个完整的键盘... 但我需要他们所有人来使控制设置工作。

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

+0

Ubuntu不是Unix。它是linux。它们是有区别的。 – epochwolf 2009-03-07 13:07:42

+0

但它是基于unix的...(后期编辑肯定) – Calmarius 2009-03-07 13:30:00

+0

避免参数并将其称为GNU。参见 http://www.dwheeler.com/sloc/ – ashawley 2009-03-12 21:56:02

回答

7

如果你还没有考虑它,你可能可以使用 SDL

+0

添加一个链接会使这个答案更有用。 – 2009-03-07 13:52:37

1

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

glutKeyboardFunc glutSpecialFunc glutGetModifiers 结合可能足以满足跨平台键盘代码的要求,GLUT甚至可以用于其他输入设备。

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

1

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

SDL 是要走的路。这看起来很基本,但是一旦你开始向SDL的邪恶神灵献祭小孩,像 SDL_image (完美用于阅读大量图像文件格式 - 有时我使用SDL仅用于读取JPEG)或 SDL_mixer (唯一解决方案您需要阅读和播放基本音频 - OGG,WAV,...)。

所以看看没有SDL。一旦开始使用SDL_gfx,即使是2D图形支持也不错。 SDL可能起初看起来很基本,但是一旦您计算了构建在其周围的所有额外的库,并且一旦您为它编写了几个包装器,就会看到SDL是裸露生活必需品与高级应用程序易用性之间的完美平衡。

我很乐意以任何方式帮助您使用SDL,因为我觉得它太棒了。

1

我可能会misunderestimating你在这里看到什么,但看 raw keycode returned 会导致硬件,操作系统,配置和平台的差异,所以应该由 key event 可以看 virtual keycode returned

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

如果是这种情况,您不需要抛弃所做的事情,但是如果您只为输入内容添加 SDL ,则会发现返回 SDL_keysym 的调用不仅返回硬件扫描代码(你可以对“修复”不做任何事情),但也映射到一个Unicode字符和一个虚拟符号,这是我想你要找的。希望他们的调用没有这个numlock修饰符问题。

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。