4

在 SDL 2 中搜索同时检测多个键的方法时,我遇到了 SDL 1.x 的这段代码:

//author: Rob Loach
// Global key buffer
bool keys[256];

while(SDL_PollEvent(&mainEvent))
{
   if(mainEvent.type == SDL_KEYDOWN)
   {
       keys[mainEvent.key.keysym.sym] = true;
   }
   else if(mainEvent.type == SDL_KEYUP)
   {
       keys[mainEvent.key.keysym.sym] = false;
   }
}

我尝试在 SDL2 和 a 中实现它std::array<bool, 256>,但我Segmentation fault: 11使用了向上按钮。

那是我看到这个的时候:https ://wiki.libsdl.org/SDLKeycodeLookup 。

大多数“特殊”键,包括箭头、功能、符号等,都有十亿的十进制表示。

即使打开了简单的代码printf("%d\n", e.key.keysym.sym);,也可以说向上按钮给出:

1073741906
Segmentation fault: 11

我在 Mac 上,如果它与错误代码有任何区别。

那么,SDL 2 中有哪些解决方案呢?

4

1 回答 1

4

首先,bools 不默认为 中的任何内容C++,您需要对其进行初始化。它们似乎总是如此的事实是true它们byte的大小。这意味着它们的大小介于两者0之间255。只是0意味着false它有255 / 256机会true


至于您的解决方案,您只需将您的定义std::map为:

std::map<SDLKey, bool> keyMap;

Anstd::map最初是空的,因此您需要在尝试查找时检查项目是否确实存在。

bool IsKeyDown(SDLKey key)
{
    // Look for element
    auto it = keyMap.find(key);

    if (it == keyMap.end())
        // No element found, which means this key hasn't been pressed
        return false;

    // 'it' is an iterator, so we use * to return its value
    return it->second; 
}

当您尝试设置一个项目时,如果它不存在,它将自动创建:

bool SetIsKeyDown(SDLKey key, bool isDown)
{
    keyMap[key] = isDown
}

因此,std::map最初为空的事实意味着您不需要填充它。如果你愿意,你可以,但它不像数组那样需要。

于 2015-06-13T07:20:56.317 回答