我最近从SFML切换到libtcod用于我的胭脂,因为我发现libtcod对于那些类型的游戏更方便。我找不到任何解决方案的一个问题是如何存储键盘绑定功能。
在SFML中,我可以为我的键功能
执行此操作std::map<sf::Keyboard::Key, std::function<void()>> keyboardCommands
在libtcod中有TCOD_Key_t结构(它将取代地图中的sf :: Keyboard :: Key),它适用于特殊键,如F键,Esc等。but "nothing" for letters.
libtcod是否有办法将所有键盘功能放在一张地图上?
答案 0 :(得分:1)
免责声明:我从未使用过此库!
我找到this:
Any other (printable) key :
TCODK_CHAR
因此,当您收到TCODK_CHAR
时,您会从this struct寻找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
回调添加到地图中,但是,如果TCOD_keycode_t
枚举的某些成员与字符代码匹配,则会发生密钥冲突(即假设{{1} }具有值TCODK_UP
,它将与char 65
(ASCII代码'a'
))相同。
您还可以使用另一个65
或map
将字符(array
)映射到不同的功能。