Я недавно перешел с 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
, это будет тот же ключ, что и char 'a'
(Код ASCII 65
)).
Вы могли бы также иметь другой map
или же array
что карты персонажей (key.c
) к разным функциям.
Других решений пока нет …