改变游戏中的游戏控制

时间:2014-03-12 08:20:55

标签: c++ controls 2d-games allegro

我在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等类型存储类型...

谢谢!

2 个答案:

答案 0 :(得分: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";

参考文献:

答案 1 :(得分:0)

所有这些密钥代码都应该是定义的数字。所以也许尝试使用整数。

int key = ALLEGRO_KEY_DOWN;

这应该有用。