最近,我从SFML切换到libtcod,因为我发现libtcod对于这类游戏更方便。一个我找不到任何解决方案的问题是如何存储键盘绑定函数。
在SFML中,我可以为我的关键函数做到这一点。
std::map<sf::Keyboard::Key, std::function<void()>> keyboardCommands在libtcod中,有一个TCOD_Key_t结构(它将取代映射中的sf::键盘::键),它适用于F键、Esc等特殊键。但“没什么”的信。
有办法用libtcod把我所有的键盘功能放在一张地图上吗?
发布于 2015-12-15 23:25:28
免责声明:我从未使用过这个图书馆!
我找到了这
Any other (printable) key :
TCODK_CHAR因此,当您收到TCODK_CHAR时,您需要从这个结构中查找char c;
typedef struct {
TCOD_keycode_t vk;
char c;
unsigned pressed : 1;
unsigned lalt : 1;
unsigned lctrl : 1;
unsigned ralt : 1;
unsigned rctrl : 1;
unsigned shift : 1;
} TCOD_key_t;我相信它会包含按下的文字。
更新
它是一个C库,所以预期的使用可能是这样的:(这里的key是TCOD_key_t类型的)
switch(key.vk) {
case TCODK_UP : onUp(); break;
case TCODK_CHAR: onChar(key.c); break
default: break;
}有了地图,您可以做如下事情:
if(TCODK_CHAR == key.vk)
onChar(key.c);
else
specialCommands[key.vk]();(其中specialCommands是std::map<TCOD_keycode_t, std::function<...> > )
您可以将char回调tinto放到映射中,但是,如果TCOD_keycode_t枚举的某些成员将匹配字符代码,则会出现密钥冲突(如果假设TCODK_UP有值65,则它将与char 'a' (ASCII代码65)相同)。
您还可以使用另一个map或array将字符(key.c)映射到不同的函数。
https://stackoverflow.com/questions/34301299
复制相似问题