1

我最近从 SFML 切换到 libtcod 来玩我的 rougelike,因为我发现 libtcod 更适合这类游戏。我找不到任何解决方案的一个问题是如何存储键盘绑定功能。

在 SFML 中,我可以为我的 keyfunctions 执行此操作

std::map<sf::Keyboard::Key, std::function<void()>> keyboardCommands

在 libtcod 中有一个 TCOD_Key_t 结构(它将替换地图中的 sf::Keyboard::Key),它适用于 F 键、Esc 等特殊键,但对于字母“无”。

有没有办法使用 libtcod 我可以将所有键盘功能放在一张地图中?

4

1 回答 1

1

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

我发现了这个

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回调添加到映射中,但是,如果TCOD_keycode_t枚举的某些成员将匹配字符代码,则您将发生键冲突(即,如果假设TCODK_UP具有 value 65,它将与 char 'a'(ASCII 代码65)相同)。

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

于 2015-12-15T23:25:28.493 回答