gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:25:06 25 4
gpt4 key购买 nike

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

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

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”),但我做了一些研究,我认为我的理解是在运行时创建函数是不可能的。那么,我应该采用哪种方法? ...我知道这是一个抽象的问题...但我真的不知道如何解决这个问题。

感谢任何帮助的建议!对不起,我的解释能力很差...英语不是我的语言!

最佳答案

如果我理解正确你想表达什么,你正在编写一个脚本引擎,将一些在运行时构建的逻辑解释为一个字符串,这应该决定在 Player 上做什么和数据。如果是这样,我可以想象你应该有这样的功能

void InterpretScriptCode(Player* p, void* data, string const& code)

或解释和执行pdata 上的code 中描述的逻辑的等价物。

然后,您可以使用 std::bindstd::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 输入传递给您的 register_event_source() 函数。

顺便说一句,您可能对使用 Boost.Signals/Boost.Signals2 实现事件注册/处理感兴趣。

如果你不使用 C++11,你可以使用 boost::bindboost::function 而不是 std::bindstd::function

关于c++ - 在运行时创建自定义事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14305866/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com