SDL2枚举<;未命名>;::SDL_[key]强制执行越界异常 我用C++编写了一个小型的OpenGL应用程序,用SDL2进行窗口创建和输入处理。
现在我有一组布尔值,表示是否按下了相应的键SDL2枚举<;未命名>;::SDL_[key]强制执行越界异常 我用C++编写了一个小型的OpenGL应用程序,用SDL2进行窗口创建和输入处理。,c++,exception,opengl,keycode,sdl-2,C++,Exception,Opengl,Keycode,Sdl 2,现在我有一组布尔值,表示是否按下了相应的键 static const int NUM_KEYS = 512; static bool Inputs[NUM_KEYS]; static bool DownKeys[NUM_KEYS]; static bool UpKeys[NUM_KEYS]; 我的输入更新方法如下所示: SDL_GL_SwapWindow(m_window); for(int i = 0; i < NUM_KEYS; i++) { g_
static const int NUM_KEYS = 512;
static bool Inputs[NUM_KEYS];
static bool DownKeys[NUM_KEYS];
static bool UpKeys[NUM_KEYS];
我的输入更新方法如下所示:
SDL_GL_SwapWindow(m_window);
for(int i = 0; i < NUM_KEYS; i++)
{
g_DownKeys[i] = false;
g_UpKeys[i] = false;
}
while(SDL_PollEvent(&e))
{
if(e.type == SDL_QUIT)
{
m_isClosed = true;
}
switch(e.type)
{
case SDL_KEYDOWN:
g_DownKeys[e.key.keysym.sym] = true;
g_Inputs[e.key.keysym.sym] = true;
break;
case SDL_KEYUP:
g_UpKeys[e.key.keysym.sym] = true;
g_Inputs[e.key.keysym.sym] = false;
break;
default:
break;
}
}
if(g_Inputs[SDLK_w])
{
//this works just fine, because SDLK_w = 119
}
if(g_Inputs[SDLK_UP])
{
//this crashes the program, because SDLK_UP = 1073741906
}
SDL_GL_SwapWindow(m_窗口);
对于(int i=0;i
我还在这里找到了每个键及其键码的列表:
正如你们所见,我只能使用键盘上的键,最大键码为127(十进制)
我还注意到SDL2对键使用枚举,因此当我将光标悬停在Visual Studio上时,会显示:enum::SDLK\u UP=1073741906
,但正确的方法是:enum SDLKey::SDLK\u UP=1073741906
。
所以,斯德基在什么地方失踪了
我认为我的输入处理还可以。
如何解决索引越界异常的问题?
因此,我认为我必须用SDLKey枚举解决这个问题。我通过使用
SDL1.2
而不是SDL2
解决了这个问题
SDL2.lib
,SDL2main.lib
[,SDL2test.lib]
你的项目SDL.lib
和SDLmain.lib
SDL2.dll
SDL.dll
- 现在需要修复链接器中的其他lib目录
您还必须重写创建窗口的代码
(例如,
而不是SDL_表面
等)SDL_窗口
当您使用SDL1.2时,您可以在
SDL_keysym.h
中找到缺少的enum SDL_键
好吧,如果您的数组有512个元素,然后您发现SDLK_UP
的值是1073741906,您不应该对“索引越界”异常感到惊讶,对吗?:)
SDL2对“键码”和“扫描码”进行了区分
- 扫描码表示键盘上的物理键。它们源自USB键盘规范
- 键码表示打印在键盘上的图示符。keycode通常是打印在键上的字符的Unicode代码,但对于非字符键(如箭头键),会使用非常大的特殊值
static const int NUM_KEYS = SDL_NUM_SCANCODES;
然后将每次出现的keysym.sym
替换为
keysym.scancode
最后使用:
我不认为使用SDL1.2是一个答案,而是一种解决方法。
SDL_SCANCODE_W
SDL_SCANCODE_UP
etc.