SDL_Keycodes 太大,无法存储
SDL_Keycodes are too big for storage
在 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。
大多数 'special' 键,包括箭头、功能、符号等,都以十亿为单位进行十进制表示。
即使使用简单代码 printf("%d\n", e.key.keysym.sym);
,假设向上按钮给出:
1073741906
Segmentation fault: 11
我正在 Mac,如果它与错误代码有任何区别。
那么,SDL 2 中有哪些解决方案?
首先,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
最初是空的,这意味着您不需要填充它。如果你愿意,你可以,但它不像数组那样是必需的。
在 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。
大多数 'special' 键,包括箭头、功能、符号等,都以十亿为单位进行十进制表示。
即使使用简单代码 printf("%d\n", e.key.keysym.sym);
,假设向上按钮给出:
1073741906
Segmentation fault: 11
我正在 Mac,如果它与错误代码有任何区别。
那么,SDL 2 中有哪些解决方案?
首先,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
最初是空的,这意味着您不需要填充它。如果你愿意,你可以,但它不像数组那样是必需的。