游戏脚本设计模式
2012-10-26 3:28:40
收藏:0
阅读:192
评论:2
我是一名网页设计师,正在尝试创建一个游戏。 经过一些调查,我并没有找到任何游戏的明确的设计模式,除了状态机(似乎这是每个人都在做的)。
人们谈论游戏中的脚本,但我却找不到一个好的资源,或者更好的说,一个运行代码的好例子。
我看了看 Lua 和 Groovy ,但是我有点不知道该如何使用这些脚本语言与游戏的基本代码集成。
感谢任何帮助(书籍,网站等)。
原文链接 https://stackoverflow.com/questions/4628866
点赞
stackoverflow用户22437
这个问题是关于游戏的,但相同的逻辑也适用于任何根据用户交互在运行时表现不同的应用程序。正如Mark所说,您可以在应用程序解释脚本方面进行实现,或者直接在核心应用程序中构建功能。为什么要选择前者?
- 它使您的游戏可以被修改; 用户可以添加功能或专业化您的游戏。
- 它将平台(硬件或操作系统)与游戏逻辑分开; 这使得不同的团队可以同时处理游戏的不同方面。这也使得移植或更新游戏变得更加容易。
- 它将应用程序(文件、网络、UI)和游戏(任务、图形、声音)数据分开。应用程序和游戏创建是不同的技能集,尝试同时进行两者就像尝试制作您既是导演又是演员的电影一样容易。
所以你决定要创建一个可脚本的游戏;该如何做?首先决定你想成为导演(编写游戏引擎)还是演员(运行脚本)。Noctrine贴了一些编写游戏引擎的好链接。
如果你想编写脚本,则最好选择一个现有的游戏引擎。《无冬之夜》是一款拥有良好modding社区的发行游戏。如果您想要一个免费、开源、可脚本的游戏,则可以考虑Dungeon of Despair。
我不建议尝试自己创建游戏引擎、脚本语言和游戏逻辑。虽然有可能,但这是一项巨大的工作量。
2011-01-10 20:01:33
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
有多种方法来支持游戏中的脚本,这是一个滑动比例。
在一个极端,你可以使用脚本语言来运行几乎所有东西,因此你可以使用脚本来定义所有数据、逻辑等,只需在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++用于核心引擎部分,因为这是常见的选择,但它可以是任何对你的目的足够快的语言。