带有libtcod c++的键盘命令功能

keyboard command functionality with libtcod c++

本文关键字:命令 功能 键盘 libtcod c++ 带有      更新时间:2023-10-16

我最近为我的rougelike从SFML切换到了libtcod,因为我发现libtcod对这类游戏更方便。我找不到任何解决方案的一个问题是如何存储键盘绑定的函数。

在SFML中,我可以为我的关键功能做这件事

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

在libtcod中,有一个TCOD_Key_t结构(它将取代映射中的sf::Keyboard::Key),它适用于F键、Esc等特殊键,但对字母"不适用"。

有没有一种方法可以使用libtcod将我所有的键盘功能放在一个映射中?

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

我发现了这个:

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的值为65,则它将与字符'a'(ASCII代码65)是相同的密钥)。

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