我正在用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”),但我做了一些研究,我认为我理解的是在运行时创建函数是不可能的。 那么,我应该采用哪种方法? ......我知道这是一个抽象的问题......但我真的不知道如何处理这个问题。
感谢您提供任何帮助!抱歉我的解释能力不好......英语不是我的语言!
答案 0 :(得分:2)
如果我正确理解您要表达的内容,那么您正在编写一个脚本引擎,它将运行时构建的一些逻辑解释为字符串,这应该决定在Player
和{{1 }}。如果是这样,我可以想象你应该有像
data
或等同于解释和执行 void InterpretScriptCode(Player* p, void* data, string const& code)
code
和p
{}}中描述的逻辑的东西。
然后,您可以使用data
和std::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
函数。
如果您不使用C ++ 11,则可以使用register_event_source()
和boost::bind
代替boost::function
和std::bind
。