在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中有哪些解决方案呢?
答案 0 :(得分:4)
首先,bool
不默认为C++
中的任何内容,您需要初始化它们。它们似乎始终为true
的事实是它们的大小为byte
。这意味着它们的大小介于0
和255
之间。只有0
表示false
,255 / 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);
});
};
最初为空的事实意味着您无需填写它。如果你愿意,你可以这样做,但不需要像数组一样。