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
  • 现在您设置了SDL1.2

    • 现在需要修复链接器中的其他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.