SDL_Keycodes太大,无法存储

时间:2015-06-13 06:42:44

标签: c++ segmentation-fault sdl-2 signed-integer

在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和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中有哪些解决方案呢?

1 个答案:

答案 0 :(得分:4)

首先,bool不默认为C++中的任何内容,您需要初始化它们。它们似乎始终为true的事实是它们的大小为byte。这意味着它们的大小介于0255之间。只有0表示false255 / 256 true std::map std::map<SDLKey, bool> keyMap;

至于您的解决方案,您只需将std::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

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

https://graph.facebook.com/{post-id}?fields=shares&access_token=xxxx

因此this.post = function (ItemDetails) { $http.post('http://localhost:4191/Service1.svc/addItemMaster', ItemDetails). success(function (data) { console.log('data', data); // when call is successful you code here }). error(function (err){ console.log('Error:', err); }); }; 最初为空的事实意味着您无需填写它。如果你愿意,你可以这样做,但不需要像数组一样。