如何开始使用可嵌入脚本技术?

3

我正在用C++编写一款游戏。尽管如此,有人告诉我应该使用可嵌入的脚本语言,比如Lua或Angelscript,但说实话,我不知道怎么做以及为什么要这样做。使用这种方式,相较于将所有数据存储在某种文本文件中,会给我带来哪些优势?我该如何开始?我试着读了一些Lua的例子,但我并不理解它是如何工作的,也不知道我应该如何使用它。

3个回答

4
首先是“为什么”的问题:
如果你已经取得了合理的进展,那么你会有游戏场景和一种GUI,其中包含可见的游戏控件:地图、指南针、热键、聊天框等等。如果你通过配置文件使GUI(位置、大小、设置、默认值等)可配置,那么对于初学者来说这是可以接受的。但是,如果你通过代码控制它,那么你就可以做很多非常酷的事情。例如:在进入城市时最小化地图。在组中显示其他玩家的肖像。更新地图。在战斗中显示不同的热键。这种东西。
现在你可以在C/C++代码中控制GUI,但一个问题是每当你想要改变行为,即使只是一点点,你都需要重新编译整个游戏客户端。如果你有数十亿的玩家,你必须给他们所有人都发一个新的游戏客户端。这是一个大问题。另一个问题是,没有任何办法让玩家自定义GUI。
一个简单的嵌入式语言解决了这两个问题。你可以把那种代码放在单独的文件中,在运行时加载,并且可以随意调整。如果你想以某种次要的方式更新GUI,你可以从游戏本身分离出GUI代码的更新。
至于“如何”:
最简单的方法是为每一帧调用一个(例如)Lua“主”例程,可能传递一些参数与最新的可更新信息,并让该主例程调用其他函数来执行所需的操作。需要注意的是,你的嵌入式代码只在短时间内获得控制权,即两次屏幕刷新之间的时间;所以它会进行一些更新和绘画,然后再次退出并将控制权返回给C/C++的主程序循环。
从技术上讲,在程序中嵌入Lua解释器非常容易。Lua解释器有C源代码,或者对于Windows有预编译库(DLL)。只需将它们链接到你的程序中,初始化一次,在主帧循环的每次迭代中调用入口点,完成。

3
脚本比将所有数据存储在文本文件中更加强大。您可以分配任意行为,从其他数据构造数据(例如,兽人首领是稍微多了一点的兽人),等等。
与C ++相比,脚本允许更快的开发和更容易的维护。没有编译/编辑/链接周期,您甚至可以在游戏运行时调整脚本,并且它们更容易在最终用户的计算机上更新。
就如何做到这一点而言,一个建议是看看其他游戏是如何做的。例如,用C编写的Roguelike RPGTOME广泛使用Lua。

我的一个朋友将Lua移植到了一个没有操作系统的嵌入式DSP C/汇编应用程序中。然后他想出了如何使用新的Lua字节码更新图像。他能够将编辑-编译-链接-加载-初始化-测试循环时间从约15分钟缩短到1分钟。作为C++开发人员,你会花费很多时间等待加载、构建和初始化。但是使用Lua可以在运行时改变很多行为。 - Jay Godse

1

如果需要灵感,可以查看C2 wiki上描述的交替硬和软层模式。

至于我的建议,为什么要嵌入脚本语言?我经历过的一些原因包括:

  • REPL
  • 易于字符串操作工具
  • 利用循环、宏和递归在数据集内部实现强大功能
  • 创建动态生成的内容
  • 从网络获取内容的包装器
  • 提供默认值的逻辑,如果数据缺失
  • 在数据集级别编写单元测试

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接