在这种情况下我应该使用脚本吗
Should I be using scripting in this circumstance?
我正在写一个游戏。它在c++中是一个direct x,我想我正在制作自己的引擎,因为我正在从winproc开始编程。
我已经取得了很大的进步,比如声音、碰撞检测、特定于我游戏设置的人工智能、从瓷砖上创建动态图形。
在对事件编程做了一些研究之后,我被告知要"编写脚本"。我已经对此进行了研究,据我所见,脚本是用来让非程序员添加到项目中的。
我是一个非常好的程序员,除了图形或地图设计等外部工作外,我无意让其他人参与游戏。我已经有了一个功能,可以从csv文件中读取地图。这些不仅包含瓦片布局,还包含npc数据、入口/出口。其他性质相同的文件控制怪物和项目数据,这样我就可以在不重新编译的情况下更新内容。
因此,我想听听经验丰富的程序员的意见,也许还有现实世界中与我的情况有关的例子,为什么我应该或不应该在游戏中使用脚本?
NPC和怪物数据需要能够包含一些简单的逻辑,比如"如果玩家有这个物品"、"如果玩家去过某个地方"、"是否玩家从右边过来"等等。为此,你需要能够定义一些组合的动作和条件。这被称为脚本,最好通过结合一些现有的脚本语言解释器来完成,比如Lua、Python、JavaScript的一些变体等等。
在游戏中使用脚本系统有几个原因,而不仅仅是如您所指出的,允许非程序员添加游戏内容。我专业开发的第一款游戏使用了脚本系统,唯一编写脚本的人是创建脚本系统的程序员。他们使用它有两个原因:
-
构建时间
可以快速测试新的数据文件/脚本文件。这个特定的引擎不支持它,但有些引擎允许在游戏运行时重新加载脚本文件。你在构建-部署测试周期中迭代的次数越多,你就越能在推特上发布你的游戏,最终得到一个更好的游戏。
-
表达能力
客户化脚本系统可以让您轻松地表达/编码传统编程中繁琐的概念。例如,我现在使用的游戏引擎允许我轻松地控制脚本中的并发动画。
我不认为脚本在您的情况下是完全必要的。添加脚本支持引擎背后的好处已经在本页上下列出。
- 它给你一种简单的语言
- 没有受过训练的人更容易接触到它
- 它可以在运行中编译,热在运行时交换
对于许多大型球队的高端比赛来说,这些项目非常重要。但这实际上取决于你的发动机的目标。如果你不考虑共享你的引擎,只计划自己开发游戏,那么脚本确实会失去一些好处。添加脚本语言也有一些缺点。
- 为引擎增加复杂性和创建时间
- 增加调试时间,即使脚本语言有一个出色的调试器,在两种语言之间切换也永远不会顺利
只要您仍然有数据驱动的设计(将统计数据和类型保存在单独的文件中,这些文件可以在运行时交换),您就可以保留热交换数据以进行快速迭代的能力。
明确添加脚本。这是一个重新编译整个游戏的皮塔,因为你的玩家造成的伤害是0.8,而不是1.0。此外,如果你想在某些情况下打开一扇门,你肯定需要它。我会用脚本语言完成大部分游戏,它只是更灵活。
大人物正在使用脚本语言。例如,Eve Online是用无堆栈的python编写的。其他示例可在此处找到:http://wiki.python.org/moin/PythonGames
- 我是c ++的新手,你能解释一下在这种情况下的指针吗
- 在这种情况下,java对象是否可以调用本机函数
- 在这种情况下显式调用时,std::cout 如何更改析构函数的行为?
- 在这种情况下,我真的复制了字节还是复制了字符?
- 为什么在这种情况下,bool 类型的输出等于 0?
- 在这种情况下,如何传递成员函数而不是函数?
- 为什么在这种情况下递增阵列名称有效?
- 在这种情况下我应该使用哪种设计模式
- 为什么在这种情况下我需要 .template
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 在这种情况下,"typename..."意味着什么?
- 为什么在这种情况下 x = 44?
- 在这种情况下是私有的吗?试图使操作员<<过载
- 在这种情况下,如何防止C++输出/控制台窗体关闭
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 为什么在这种情况下,前向声明不起作用?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在这种情况下,为什么模板即时深度超过限制?
- 在这种情况下我应该使用脚本吗