我想为我的 C++ 游戏引擎添加脚本功能。
我有 Engine.exe
、Physics.dll
、Audio.dll
,我正在添加 Scripting.dll
是高级 Racket 包装器。
Engine.exe
加载Physics.dll
并设置物理世界,加载Audio.dll
并设置音频世界。它应该加载 Scripting.dll
,设置与 Physics.dll
、Audio.dll
的绑定(bind)并加载游戏脚本。
据我所知,有两种可能的方法可以将 Racket 嵌入到 C++ 程序中:
使用 Foreign Interface由于需要加载 Physics.dll
、Audio.dll
两次,所以看起来很奇怪:第一次是从 Engine.exe
,然后是游戏脚本。
写作 Extensions看起来更有吸引力,因为它允许在 C++ 端进行脚本绑定(bind)。另一方面,您必须使用 raco ctool
构建您的扩展,将其与 mzdyn
目标文件链接——这看起来也很尴尬:为什么不制作 mzdyn
一个静态库?
我想实现一个方法,例如setupScriptBindings()
,在 Physics.dll
和 Audio.dll
中,并从 Engine.exe
中调用它> 在启动时。
有没有简单的方法来做到这一点?
最佳答案
在使用了将 Racket 连接到 C 代码的扩展和 FFI 方法之后,我不得不说 FFI 方法好得多。 Racket 中与 C 函数的绑定(bind)指定明确且健壮,在 Racket 中处理 C 类型非常好。使用 FFI 方法的唯一缺点是,据我所知,您的 Racket 程序必须是驱动程序应用程序。
使用嵌入方法,您的 C/C++ 可执行文件是驱动程序,但使用 Racket 代码声明接口(interface)更加手动且容易出错。更不用说您必须弄清楚 raco ctool 并复制它,或者让 racket 的构建系统接管您的构建系统。为了我们的目的,我们结束了提取 Racket 源并自己构建它。我真的不推荐这种方法。
最终出于我的目的,让我的应用程序成为一个带有外部 .DLL/.so 文件的 Racket 应用程序,它为 C 函数加载的文件效果最好,但听起来您可能会坚持使用嵌入方法。
关于c++ - Racket 作为游戏引擎中的脚本语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738430/