在搜索SDL 2中一次检测多个键的方法时,我看到了SDL1.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>中实现它,但是有了up按钮的Segmentation fault: 11。
这就是我看这个的时候:https://wiki.libsdl.org/SDLKeycodeLookup。
大多数“特殊”键,包括箭头、函数、符号等等,都有数十亿的小数表示。
即使打开了简单的代码printf("%d\n", e.key.keysym.sym);,比如up按钮也会给出:
1073741906
Segmentation fault: 11我在Mac上,如果它与错误代码有任何区别的话。
那么,SDL 2中有什么解决方案呢?
发布于 2015-06-13 07:20:56
首先,bool不默认为C++中的任何内容,您需要对它们进行初始化。它们看起来总是true的事实是,它们的大小是byte。这意味着它们的大小介于0和255之间。只有0的意思是false,所以这是true的255 / 256机会。
至于您的解决方案,您只需将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://stackoverflow.com/questions/30815857
复制相似问题