我在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等类型存储类型...
谢谢!
答案 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;
这应该有用。