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

Я недавно перешел с 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) к разным функциям.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]