2014-03-12 42 views
1

我是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键码的变量(我不知道这样的类型存在)型,其关键代码(例如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 ...

谢谢!

回答

0

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

这可能是一些像

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; 

这应该起作用。