我开始研究一个真正基本的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[]
数组的类型是可以改进的?
答案 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
)并对其进行操作。这样可以更轻松地处理事件和密钥重映射。