游戏脚本设计模式

我是一名网页设计师,正在尝试创建一个游戏。 经过一些调查,我并没有找到任何游戏的明确的设计模式,除了状态机(似乎这是每个人都在做的)。

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

我看了看 Lua 和 Groovy ,但是我有点不知道该如何使用这些脚本语言与游戏的基本代码集成。

感谢任何帮助(书籍,网站等)。

原文链接 https://stackoverflow.com/questions/4628866

点赞
stackoverflow用户83891
stackoverflow用户83891

有多种方法来支持游戏中的脚本,这是一个滑动比例。

在一个极端,你可以使用脚本语言来运行几乎所有东西,因此你可以使用脚本来定义所有数据、逻辑等,只需在C/C++中拥有一些核心引擎功能。在这个方案中,C/C++*的几乎所有东西都只是在那个一侧使它足够高效或因为它已经用该语言编写了而且重新实现将是昂贵的。

在另一个极端,你可以将大部分游戏代码和数据定义在C/C++中,并实现绑定和/或回调,以允许通过脚本进行一些自定义。绑定(例如[LuaBind](http://www.rasterbar.com/products/luabind.html))允许你的脚本获取和设置未在脚本代码中定义但在C/C++侧的值/调用函数。回调允许脚本监听游戏事件被触发,例如,当实体即将受到伤害时调用的脚本。然后你可以通过脚本来自定义/扩展游戏逻辑。

书籍Game Engine Architecture很好地解释了可能性,虽然它并不包括样例代码或类似的东西。

脚本的如何很大程度上取决于你的实现风格和你选择的核心和脚本语言。如果你想得到更具体的东西,请尝试关注一些语言选择(例如C ++和Lua),然后找到一些教程,例如这个

开发脚本的原因取决于采取的方法,但通常是为了将游戏玩法功能/行为/数据与游戏引擎的核心分离。这使得更容易进行更改,因为你可以在运行时重新加载脚本而不必重建整个项目。一个实现良好的脚本系统也使参与或扩展游戏的人更容易而不会麻烦一位程序员。

一个具体的例子:

您可能希望构建一个功能,在回合结束时告诉玩家他们在整个回合中造成了多少伤害。

如果你在C++/核心侧这样做,它意味着让程序员放入大量非常特定的代码来服务于一个非常特定的功能,重建整个项目并部署新版本。然后他们会与设计师确认一切是否成功。如果不行,他们必须重新编码和重建,浪费很多时间。

通过一个设计良好的脚本系统,只需将一个round_damage.lua脚本放入脚本文件夹中。当游戏启动时,该脚本会自动捕获并激活,每当玩家受到伤害时,“OnDamageReceived”处理程序就会被触发。当回合结束时,将触发OnRoundEnded回调函数,该脚本将显示消息。

只要暴露了一组丰富的钩子,一个脚本编写者就可以在不需要程序员帮助的情况下完成所有这些。如果他们犯了一个错误或想尝试别的什么,脚本编写者可以立即重新加载脚本而不关闭游戏。

*注意,我说C/C++用于核心引擎部分,因为这是常见的选择,但它可以是任何对你的目的足够快的语言。

2011-01-07 19:06:51
stackoverflow用户22437
stackoverflow用户22437

这个问题是关于游戏的,但相同的逻辑也适用于任何根据用户交互在运行时表现不同的应用程序。正如Mark所说,您可以在应用程序解释脚本方面进行实现,或者直接在核心应用程序中构建功能。为什么要选择前者?

  1. 它使您的游戏可以被修改; 用户可以添加功能或专业化您的游戏。
  2. 它将平台(硬件或操作系统)与游戏逻辑分开; 这使得不同的团队可以同时处理游戏的不同方面。这也使得移植或更新游戏变得更加容易。
  3. 它将应用程序(文件、网络、UI)和游戏(任务、图形、声音)数据分开。应用程序和游戏创建是不同的技能集,尝试同时进行两者就像尝试制作您既是导演又是演员的电影一样容易。

所以你决定要创建一个可脚本的游戏;该如何做?首先决定你想成为导演(编写游戏引擎)还是演员(运行脚本)。Noctrine贴了一些编写游戏引擎的好链接。

如果你想编写脚本,则最好选择一个现有的游戏引擎。《无冬之夜》是一款拥有良好modding社区的发行游戏。如果您想要一个免费、开源、可脚本的游戏,则可以考虑Dungeon of Despair

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

2011-01-10 20:01:33