функциональность клавиатурных команд с libtcod c++

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

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

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

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

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


person val    schedule 15.12.2015    source источник


Ответы (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) с различными функциями.

person Ivan Aksamentov - Drop    schedule 15.12.2015
comment
Как бы я поместил это в одну карту? Для специальных ключей потребуется TCOD_keycode_t, а для символов потребуется c. Я могу думать о том, что у меня будет карта для TCOD_keycode_t-s и одна для символов. и в моей проверке событий проверьте, пусто ли c, а затем проверьте соответствующую карту. - person val; 16.12.2015
comment
@val добавил информацию о куполе - person Ivan Aksamentov - Drop; 16.12.2015