如何使用SDL2在数组中有效存储按下的键值?

时间:2014-08-21 11:32:37

标签: c++ sdl-2

我开始研究一个真正基本的3D引擎来开始使用OpenGL。所有的装饰都很好,我现在正在进行键盘控制。

为此,我实现了一个类Camera,它包含activateKey(GLint)方法。当主循环中接收到SDL_KEYDOWN事件时,它意味着存储按下的键的值,执行camera->activateKey(windowEvent.key.keysym.sym);。例如,当我按'W'继续前进时,数组GLboolean keys[1024]将在SDLK_w索引处填充GL_TRUE。这样我就可以在每个循环中控制按下的键,并根据用户的意愿移动相机。

但是当我按下'异国情调'的钥匙(比如F9 ......我知道, 异国情调,但它不是一封信),我试图存储GL_TRUE在相应索引的keys[]中,我收到了访问冲突。我设法发现F9的GLint值是1073741890,而W是119。所以它显然是一个出界的例外。

我的问题是:是否有更优雅的方法来解决我的问题而不是在用keys[]填充GL_TRUE之前控制密钥包含在'WSAD'中?也许keys[]数组的类型是可以改进的?

1 个答案:

答案 0 :(得分:0)

一种方法是使用SDL_SCANCODE而不是SDLK。这些映射在QWERTY键盘上(因此AZERTY所有者仍然必须像QWERTY键盘那样映射控件)并且是Uint8类型,远远低于1024.基本上,人们可以这样做:

GLboolean keys[256];

并致电

camera->activateKey(windowEvent.key.keysym.scancode);

将方法内部与SDL_SCANCODE_W等值进行比较。

如果有人有更优化的答案,我很乐意接受,因为我担心操作系统和键盘类型之间存在兼容性问题。

修改

感谢Ben(见评论),我想补充说,最好尽快摆脱扫描码;通过这种方式,我的意思是将扫描码转换为自定义程序命令(如GO_FORWARD)并对其进行操作。这样可以更轻松地处理事件和密钥重映射。