游戏脚本设计模式

Dra*_*ken 4 scripting groovy lua design-patterns

我是网络开发人员,我正在尝试创建一个游戏.经过一些研究并没有真正找到任何一种确定的游戏设计模式,除了State Based(这似乎是每个人都做的).

人们谈论游戏中的脚本,但我找不到一个好的资源,或者更好的是,运行代码的一个很好的例子.

我查看了Lua和Groovy,但我对如何使用与游戏基本代码集成的脚本语言感到很遗憾.

任何帮助表示赞赏(书籍,网站等)

Mar*_*son 5

有多种方法可以支持游戏中的脚本编写; 这是一个滑动比例.

在一个极端情况下,您几乎可以使用脚本语言运行所有内容,因此您可以使用脚本定义所有数据,逻辑等,并在C/C++中使用一些核心引擎功能.在这个方案中,几乎C/C++*方面的所有内容都只是在鸿沟的那一边,以使其足够高效,或者因为它已经用该语言编写而且重新实现成本很高.

另一方面,您可以使用C/C++定义大部分游戏代码和数据,并实现绑定和/或回调以允许通过脚本进行一些自定义.绑定(例如LuaBind)允许您的脚本获取和设置未在脚本代码中定义的值/调用函数,但是在C/C++端.回调允许脚本监听被触发的游戏事件; .eg您可能有一个在实体即将受到损害时调用的脚本.然后,您可以通过脚本自定义/扩展您的游戏逻辑.

游戏引擎架构这本书很好地解释了可能性,尽管它不包括示例代码或类似的东西.

如何脚本是非常依赖于你的实现风格以及核心和脚本语言,你的选择.如果你想要更具体的东西,试着尝试一些语言选择(例如C++和Lua),然后跟踪一些像这样的教程.

原因取决于所采用的方法,但通常是将游戏功能/行为/数据从游戏引擎的内容中分离出来.这使得更容易更改,因为您可以在运行时重新加载脚本而无需重建项目的其余部分.一个很好实现的脚本系统也使人们更容易参与或修改/扩展游戏而不需要打扰程序员.

一个具体的例子:

您可能希望构建一个功能,告诉玩家他们在一轮过程中会造成多少伤害.

如果你在C++/core方面这样做,就意味着让一个程序员加载一个非常特定的代码来提供一个非常特定的功能,重建整个项目并部署一个新版本.然后他们与设计师核实一切都很棒.如果不是,他们必须重新编码和重建,浪费大量时间.

使用设计良好的脚本系统,只需将round_damage.lua脚本放入脚本文件夹即可.游戏开始时脚本会自动保持并激活,每次玩家受到伤害时,都会触发"OnDamageReceived"处理程序.当回合结束时,将触发OnRoundEnded回调,并且脚本会显示一条消息.

提供了一组丰富的钩子,脚本编写者可以在没有程序员帮助的情况下完成所有这些操作.如果他们犯了错误或想尝试别的东西,脚本编写者可以立即重新加载脚本而不关闭游戏.

*注意,我说C/C++用于核心引擎的东西,因为这是常见的选择,但它可以是任何足够快的语言.


Dou*_*rch 5

发布的问题是关于游戏的,但相同的逻辑适用于任何在运行时基于用户交互行为不同的应用程序。正如 Mark 所说,您可以在应用程序解释的脚本中实现这一点,或者直接在核心应用程序中构建功能。为什么要做前者?

  1. 它使您的游戏可修改;用户可以添加功能或专门化您的游戏。
  2. 它将平台(硬件或操作系统)与游戏逻辑分开;这允许不同的团队同时处理游戏的不同方面。它还可以更轻松地移植或更新您的游戏。
  3. 它将应用程序(文件、网络、UI)和游戏(任务、图形、声音)数据分开。应用程序和游戏创建是不同的技能组合,尝试两者都与尝试制作您既是导演又是演员的电影一样简单。

因此,您决定要创建一个可编写脚本的游戏;这该怎么做?首先决定你是想成为导演(编写游戏引擎)还是演员(运行脚本)。Noctrine 发布了一些编写游戏引擎的好链接。

如果您想编写游戏脚本,最好选择现有的游戏引擎。Neverwinter Nights 是一款已发布的游戏,拥有良好的改装社区。如果您想要一款免费、开源、可编写脚本的游戏,请考虑Dungeon of Despair

我不建议尝试自己创建游戏引擎、脚本语言和游戏逻辑。虽然可能,但这是一项巨大的工作。