libtcod c++ 的键盘命令功能

keyboard command functionality with libtcod c++

我最近为我的 rougelike 从 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 将我所有的键盘功能放在一个映射中?

免责声明:我从未使用过这个库!

我找到了 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]();

(其中 specialCommandsstd::map<TCOD_keycode_t, std::function<...> > )

您可以将 char 回调放入映射中,但是,如果 TCOD_keycode_t 枚举的某些成员将匹配字符代码,您将发生键冲突(即如果假设 TCODK_UP 的值为 65,它将与 char 'a'(ASCII 码 65)的键相同。

您还可以使用另一个 maparray 将字符 (key.c) 映射到不同的函数。