游戏中的脚本设计模式

5
我是一名网页开发者,正在尝试创建一个游戏。 经过一些研究,我没有找到任何关于游戏的明确设计模式,除了状态机(似乎是每个人都在做的)。
人们谈论游戏中的脚本编写,但我实在找不到好的资源或运行代码的好例子。
我查看了Lua和Groovy,但我有点迷失在如何将这些脚本语言与游戏的基础代码集成的问题上。
感谢任何帮助(书籍、网站等)。

你是在尝试创建一个游戏脚本语言吗?还是一个使用脚本语言的游戏?如果是后者,那么使用哪种语言?Lua?Groovy?每个问题都有不同的答案。 - Dour High Arch
3
我们在http://gamedev.stackexchange.com上有一些相关问题,可能会对您有所帮助。链接如下:http://gamedev.stackexchange.com/questions/421/how-do-you-add-a-scripting-language-to-a-game,http://gamedev.stackexchange.com/questions/11/what-scripting-language-should-i-choose-for-my-game。 - Jesse Dorsey
谢谢您介绍这个gamedev.stackexchange,我之前并不知道它的存在。 - Draiken
回答你的问题Dour,我正在尝试制作一个游戏,并想弄清楚是否值得使用脚本语言,你会如何做到这一点(不是在代码中,而是在我将要使用的设计中)。 - Draiken
2个回答

6
有多种方式来支持游戏脚本,这是一个滑动的比例尺。
一方面,你可以几乎使用所有的脚本语言运行,因此你可以使用脚本定义所有的数据、逻辑等,只需在 C/C++ 中具有一些核心引擎功能。在这种方案中,几乎所有的 C/C++* 都只是为了使其足够高效或者因为它已经用那种语言编写了并且重新实现会很昂贵。
另一方面,你可以将大部分游戏代码和数据定义在 C/C++ 中,并实现绑定和/或回调以允许通过脚本进行一些自定义。绑定(例如LuaBind)允许你的脚本获取和设置值/调用在脚本代码中未定义但在 C/C++ 侧定义的函数。回调允许脚本监听触发的游戏事件;例如你可能有一个脚本在实体即将受到伤害时被调用。然后你可以通过脚本自定义/扩展你的游戏逻辑。

这本书《游戏引擎架构》做了很好的解释,但没有包含示例代码或其他类似内容。

脚本编写的实现方式在很大程度上取决于您选择哪些核心和脚本语言。如果您想要更具体的内容,请尝试关注某些语言选择(例如C ++和Lua),然后找到一些教程,例如这个

为什么要使用脚本取决于所采取的方法,但通常是为了将游戏功能/行为/数据与游戏引擎的本质分离。这样可以更容易地进行更改,因为您可以在运行时重新加载脚本而无需重建项目的其余部分。一个良好实现的脚本系统也可以使人们更轻松地参与,或者在不打扰程序员的情况下对游戏进行修改和扩展。

具体实例:

您可能希望构建一个功能,告诉玩家他们在一轮中造成了多少伤害。
如果您在C++/核心方面执行此操作,则意味着需要让程序员放入大量非常具体的代码来服务于非常特定的功能,重新构建整个项目并部署新版本。 然后他们与设计人员检查所有内容是否完美。 如果不是,则必须重新编码和重建,耗费大量时间。
通过良好设计的脚本系统,只需将round_damage.lua脚本放入脚本文件夹即可。 游戏启动时自动捕获并激活脚本,每次玩家受到伤害时触发"OnDamageReceived"处理程序。 当回合结束时,触发OnRoundEnded回调,脚本将显示一条消息。
如果公开提供了丰富的钩子,脚本编写者可以在没有程序员帮助的情况下完成所有这些工作。 如果他们犯了错误或想尝试其他东西,则可以立即重新加载脚本而无需关闭游戏。
*注意,我说C/C++用于核心引擎部分,因为这是常见的选择,但它可以是任何足够快的语言来满足您的需求。

我理解了你的回答,但我正在寻找更实际一点的东西。我知道我们可以编写很多脚本,只保留核心语言的核心部分,或者反过来。我不知道的是如何做到这一点,为什么要这样做。对于书籍的参考表示赞赏,可惜对我来说太贵了 :) - Draiken
你正在使用哪些编程语言?你对什么样的脚本编写方法感兴趣?如果你想要更具体的内容,可以尝试查找类似于C++和Luabind教程的东西:http://www.nuclex.org/articles/cxx/1-quick-introduction-to-luabind - Mark Simpson
我还添加了更多关于你的后续评论的信息。 - Mark Simpson

5
所提出的问题是关于游戏的,但相同的逻辑也适用于基于用户交互在运行时表现不同的任何应用程序。正如Mark所说,您可以在应用程序解释脚本中实现此功能,或者直接在核心应用程序中构建功能。为什么要选择前者?
  1. 它使您的游戏可修改; 用户可以添加功能或专门化您的游戏。
  2. 它将平台(硬件或操作系统)与游戏逻辑分离; 这允许不同的团队同时处理游戏的不同方面。它还使得移植或更新游戏变得更加容易。
  3. 它将应用程序(文件、网络、UI)和游戏(任务、图形、声音)数据分开。应用程序和游戏创建是不同的技能集,试图同时完成两者就像试图制作一部电影,您既是导演又是演员一样困难。

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

如果您想编写游戏脚本,最好选择现有的游戏引擎。《无冬之夜》是一款已发布的游戏,拥有良好的修改社区。如果您想要一个免费、开源、可编写脚本的游戏,请考虑Despair Dungeon
我不建议尝试自己创建游戏引擎、脚本语言和游戏逻辑。虽然可能,但这是一项巨大的工作量。

非常感谢您的帮助,我非常感激。虽然我没有选择是做引擎还是游戏逻辑,因为没有免费的引擎符合我的需求,呵呵。再次感谢! - Draiken

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