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

Я программирую игру на 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 ...

Спасибо!


person Barcio77    schedule 12.03.2014    source источник


Ответы (2)


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

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

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";

Использованная литература:

person Some programmer dude    schedule 12.03.2014

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

int key = ALLEGRO_KEY_DOWN;

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

person cedifra    schedule 03.04.2014