在游戏中改变游戏控制

Change game controls in game

本文关键字:游戏 控制 改变      更新时间:2023-10-16

我正在用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…

谢谢!

我将有两个映射,一个将函数名映射到函数,另一个将键映射到函数名或函数。当用户想要重新映射键时,更改第二个映射。

可以是

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

引用:

  • std::unordered_map
  • std::function
  • std::bind

所有这些关键代码都应该定义为数字。所以可以尝试使用整数

int key = ALLEGRO_KEY_DOWN;