c++ - Racket 作为游戏引擎中的脚本语言

标签 c++ dll scheme racket game-engine

我想为我的 C++ 游戏引擎添加脚本功能。

我有 Engine.exePhysics.dllAudio.dll,我正在添加 Scripting.dll 是高级 Racket 包装器。

Engine.exe加载Physics.dll并设置物理世界,加载Audio.dll并设置音频世界。它应该加载 Scripting.dll,设置与 Physics.dllAudio.dll 的绑定(bind)并加载游戏脚本。

据我所知,有两种可能的方法可以将 Racket 嵌入到 C++ 程序中:

使用 Foreign Interface由于需要加载 Physics.dllAudio.dll 两次,所以看起来很奇怪:第一次是从 Engine.exe,然后是游戏脚本。

写作 Extensions看起来更有吸引力,因为它允许在 C++ 端进行脚本绑定(bind)。另一方面,您必须使用 raco ctool 构建您的扩展,将其与 mzdyn 目标文件链接——这看起来也很尴尬:为什么不制作 mzdyn 一个静态库?

我想实现一个方法,例如setupScriptBindings(),在 Physics.dllAudio.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/

相关文章:

functional-programming - 函数式编程类(class)结束时的 2 个问题

c++ - C++ 中右移的未定义行为

c++ - 多个类的 vector 未按预期使用 random_shuffle 进行洗牌

c# - 在 App_Web_*.dll 中找到了 index.cshtml 的副本,但正确的源代码与 App_Web_*.dll 中内置的版本不同,

c++ - 静态链接 SHFolder 组件

if-statement - Racket编程——我的 map

scheme - 转换为CPS(继续传递样式)

c++ - 屏蔽 C++ 头文件的内容

c++ - 如何修复我的代码以删除字符串中的空格?

windows - 如何检查哪个应用程序正在使用msvcr80.dll?