Изменить управление игрой в игре

Я программирую игру на C ++ и Allegro 5, и я хотел сделать настройки управления. Так что, если игрок хочет, он может изменить управление в меню настроек (в игре).

У меня есть этот код:

while(!exit)
{
ALLEGRO_EVENT ev;
al_wait_for_event(e_queue, &ev);

if (ev.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch(ev.keyboard.keycode)
{
case ALLEGRO_KEY_DOWN:
//player goes down...
break;
case ALLEGRO_KEY_UP:
//player goes up...
break;
case ALLEGRO_KEY_LEFT:
//player goes left...
break;
case ALLEGRO_KEY_RIGHT:
//player goes right...
break;
case ALLEGRO_KEY_SPACE:
break;
default:
break;
}
}
...
}

Я подумал, что могу сделать переменную типа ALLEGRO KEY CODE (я не знаю, существует ли такой тип), который имеет код ключа (например, ALLEGRO_KEY_LEFT), и затем заменить этот код на:

...
allegro key code       keyUP;
allegro key code       keyDOWN;
...
while(!exit)
{
ALLEGRO_EVENT ev;
al_wait_for_event(e_queue, &ev);

if (ev.type == ALLEGRO_EVENT_KEY_DOWN)
{
switch(ev.keyboard.keycode)
{
case keyDOWN:
break;
case keyUP:
break;
case keyLEFT:
break;
case keyRIGHT:
break;
case keySPACE:
break;
default:
break;
}
}
}

и добавьте в настройки что-то вроде этого:

//set 'UP' key
switch(ev.keyboard.keycode)
{
case ALLEGRO_KEY_A:
keyUP = ALLEGRO_KEY_A;
break;
case ALLEGRO_KEY_B:
keyUP = ALLEGRO_KEY_B;
break;
case ALLEGRO_KEY_UP:
keyUP = ALLEGRO_KEY_UP;
break;
...
}
}

Дело в том, что я не знаю, в каком магазине хранятся вещи типа ALLEGRO_KEY_UP, DOWN …

Спасибо!

1

Решение

У меня было бы две карты, одна, которая отображает имя функции на функцию, и другая, которая отображает ключ либо на имя функции, либо на функцию. Когда пользователь хочет переназначить ключи, измените вторую карту.

Это может быть что-то вроде

std::unordered_map<std::string, std::function<void()>> function_map;
function_map["up"]   = std::bind(&functionForUp);
function_map["down"] = std::bind(&functionForDown);
function_map["jump"] = std::bind(&functionForJump);
// etc.

std::unordered_map<int, std::string> key_map;
key_map[ALLEGRO_KEY_UP]    = "up";
key_map[ALLEGRO_KEY_DOWN]  = "down";
key_map[ALLEGRO_KEY_SPACE] = "jump";
// etc.

Чтобы вызвать функцию для определенной клавиши, используйте, например,

function_map[key_map[ev.keyboard.keycode]]();

Это позволяет вам изменить key_map по желанию:

key_map[ALLEGRO_KEY_J] = "jump";

Рекомендации:

0

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

Все эти ключевые коды должны быть определены номерами. Поэтому, возможно, попробуйте использовать целое число.

int key = ALLEGRO_KEY_DOWN;

Это должно работать.

0