c ++ - 在运行时创建自定义事件

时间:2013-01-13 17:03:46

标签: c++ function pointers runtime

我正在用Allegro用C ++创建一个2D RPG游戏引擎。我已经达到了我需要实现脚本系统的程度。所以,我的问题是这个:

我有一个名为事件的结构。在这个结构中有一个函数指针,它指向我想要在触发事件时执行的函数。所以,这是一个例子:

struct Event {
    //...
    void (*func)(Player*, void*);
    //...
}

现在,要创建一个具有此功能的事件:

Event* Events::register_event_source(int x, int y, std::string name, Player* player, void (*func)(Player*, void*));

因此,要使用它,我只需要使用此签名创建一个函数:

void test_event(Player* p, void* data)
{
    //Do something cool here
}

然后注册一个事件源,给该函数提供地址:

//...
Player* player = new Player(0, 0);
//...
Event* evt = Events::register_event_source(10, 10, "test event", player, &test_event);
//Eventually set some data for the event
evt->set_data(new std::string("Just some test data"));

这样,当玩家越过指定的地点(在这种情况下x = 10,y = 10)时,事件将触发,执行 test_event 功能中的任何代码。

现在,我的问题是:是否可以在运行时完成或至少接近这个过程? ...我需要在运行时创建函数(在本例中为“test_event”),但我做了一些研究,我认为我理解的是在运行时创建函数是不可能的。 那么,我应该采用哪种方法? ......我知道这是一个抽象的问题......但我真的不知道如何处理这个问题。

感谢您提供任何帮助!抱歉我的解释能力不好......英语不是我的语言!

1 个答案:

答案 0 :(得分:2)

如果我正确理解您要表达的内容,那么您正在编写一个脚本引擎,它将运行时构建的一些逻辑解释为字符串,这应该决定在Player和{{1 }}。如果是这样,我可以想象你应该有像

这样的功能
data

或等同于解释和执行 void InterpretScriptCode(Player* p, void* data, string const& code) codep {}}中描述的逻辑的东西。

然后,您可以使用datastd::bind来封装对脚本引擎的调用:

std::function

并将// Header <functional> needs to be included, and a proper "using namespace" // directive must be present for bringing placeholders _1 and _2 into scope std::function<void(Player*, void*)> fxn = std::bind( &InterpretScriptCode, _1, _2, "int x = 0; ... blah blah" // this should be your run-time generated script ); 输入传递给fxn函数。

不过,您可能有兴趣使用Boost.Signals / Boost.Signals2来实现事件注册/处理。

如果您不使用C ++ 11,则可以使用register_event_source()boost::bind代替boost::functionstd::bind