【发布时间】:2011-10-12 01:52:36
【问题描述】:
我正在将 Python 嵌入到我的游戏中。这些脚本将用于定义角色 AI、实体对游戏事件的反应等——这意味着游戏中的每种实体都将有一个脚本。
每个脚本都会有一个类似createEntity() 的函数或返回构造实体的函数。调用这些函数的高效(ish)方式是什么(记住,每个实体的脚本中都有一个)。
我最初的想法是像您在下面看到的那样做一些事情,但是,我不确定这样做的效率如何。例如,在我运行该字符串后,导入的 hero 模块会发生什么?它是否仍然加载在主模块中?如果是这种情况,那就有问题了,因为我要为我可能需要添加到游戏世界的所有实体导入大量脚本。
boost::python::handle<> result(
PyRun_String("import hero\n" "createEntity()\n",
Py_file_input, main_namespace.ptr(), main_namespace.ptr())
);
// Then extract the entity from `result`...
你有什么建议?
【问题讨论】:
-
如果没有更多细节,我建议您可能会倒退。如果您想在 Python 中定义行为,则使用 Python 编写应用程序,调用 C++ 以实现与机器相关的快速路径活动。以您建议的方式嵌入 Python 可以弥补两种语言的缺陷,反过来却可以发挥它们的优势。
-
@msw 到目前为止,我一直认为最终结果应该是一个可执行文件(用 C++ 编写),它可以在需要时调用 Python 中定义的函数。我的图片有问题吗?
-
无论哪种方式都可以——有调用 C 的 Python 游戏和嵌入 Python 的程序。
-
要调用模块中的函数,您必须导入模块。要导入模块,您必须运行它(由于 Python 的动态性,也因为这是所有 Python 实现的方式,而您不想构建自己的半途而废的不兼容实现)。没有办法导入模块。你在期待什么?
-
老实说,如果您正在为游戏制作嵌入式脚本语言,那么 JavaScript 或 Lua 可能是比 Python 更好的选择。它们是专门为嵌入而设计的,而 Python 往往希望从解释器和加载模块中运行。它们都使创建沙盒环境变得容易。它们更适合您尝试处理的问题。
标签: c++ python scripting boost embed