Функциональность клавиатуры с помощью libtcod C++

Я недавно перешел с SFML на libtcod для ружного типа, потому что я считаю libtcod более удобным для таких игр. Одна проблема, для которой я не могу найти какое-либо решение, заключается в том, как хранить связанные с клавиатурой функции.

В SFML я мог бы сделать это для моих ключевых функций

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

В libtcod есть структура TCOD_Key_t (которая заменит sf::Keyboard::Key на карте), которая работает для специальных клавиш, таких как F-клавиши, Esc и т. Д., Но "ничто" для букв.

Есть ли способ с libtcod, я мог бы поместить все свои функции клавиатуры в одну карту?

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 имеет значение 65, это будет тот же ключ, что и char 'a' (Код ASCII 65)).

Вы могли бы также иметь другой map или же array что карты персонажей (key.c) к разным функциям.

Другие вопросы по тегам