问题描述
我正在用C ++编写一个游戏,我想向其中添加一些动态加载的Python脚本。有一个称为GameEngine的全局服务,它是一个全局unique_ptr。我可以在代码的任何地方使用它来告诉游戏某些事情发生了。为了简化:
inline std::unique_ptr<class Game> GameEngine;
class Game
{
public:
void printHello() { std::cout<<"Hello World"<<std::endl; }
};
稍后我用以下方法初始化指针:
GameEngine = std::make_unique<Game>();
我希望能够从我的Python脚本中通知游戏有关事件的信息,所以我想我将制作一些GameWrapper:
class GameWrapper
{
public:
void printHello() { GameEngine->printHello(); }
};
并公开该类,例如:
BOOST_PYTHON_MODULE(MyGameModule)
{
using namespace boost::python;
class_<GameWrapper>("GameWrapper")
.def("printHello",&GameWrapper::printHello)
;
}
还有我的Python脚本:
from MyGameModule import *
class Script():
def execute(self):
GameWrapper().printHello()
然后我想在C ++中通过以下方式调用该脚本:
Py_Initialize();
auto module = python::import("MyGameModule");
auto script = module.attr("Script")();
script.attr("execute")();
但是不幸的是,它崩溃了,因为从Python调用时指针为null。该设计基于Ron Penton MUD游戏编程书,但他在那里使用了SWIG(实际上对我而言不是100%可以理解的),因此我决定尝试使用Boost.Python。有什么方法可以使该指针可行并影响已加载的Python脚本中已经在运行的游戏?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)