利用Python进行游戏脚本编程,不愧是最强的脚本语言!

在这里插入图片描述
使用脚本语言可以更加快速地开发游戏逻辑,而不必担心由于 C++ 程序员的粗心大意所造成的后果。使用已有的脚本语言可以节省开发新型自定义语言的时间和开销,并且这些语言通常要比自己创造的语言更加的强大。

Python 对于游戏脚本语言来说是一种不错的选择,它很强大,容易嵌入使用,能够无缝地使用 C/C++ 进行扩展,包含很多脚本语言所具有的高级特性,并且它可以用来实现自动化过程[TR1: automating production]。另外,关于 Python 的书籍、开发工具 和 库 很丰富,使得我们很容易从其他开发者那里受益。

下来就谈一谈我们在 Humongous 娱乐公司将 Python 集成进新游戏引擎的一些经验。说明我们选择 Python 的原因、获得的收益、遇到的问题,以及我们是怎样解决它们的。

为什么要使用脚本语言

C++ 是一种强大的语言,并且是 C 语言的巨大改进,但它并不是完成所有任务的最佳选择。C++ 非常强调运行时性能 [Stroustrup94],譬如,假如一个语言特性使得程序跑起来变慢,那么这个特性便不会加入 C++ 语言中。C++ 程序员也因此背负了很多的限制和烦恼。

这里列出一些限制,C++ 程序员经常遭遇这些事情但很少注意它们的存在:

  • 手工管理内存:C++ 程序员的大量时间都花在考虑调用 delete 的适当时机。
  • 链接过程:C++ 模块(在编译时或加载时)链接在一起,因此在运行时,无需进行的函数地址的解析。这提高了运行时的性能,但是却使 编辑/测试 周期变长了。
  • 缺乏自省能力 [TR2: introspection]:C++ 有自己的方式知道一个类中包含哪些成员,但是这种方式需要编写过多的加载和存储对象的代码,而在一些脚本语言中这只需调用一个内建函数就可以完成。

C++ 是静态的,而脚本语言是动态的。简单地说,C++ 的程序运行地很快,但是脚本语言能让你编码更快。

所以,C++ 应该只用在你希望优化运行时性能的地方。现在计算机的运行速度都足够快,对于大多数代码来说性能都不是问题。如果你用 C++ 开发那些用脚本语言也能实现的程序,那么你是在错误的事情上进行优化。

SCUMM 的问题

Humongous 公司已经使用 SCUMM (Script Creation Utility for Maniac Mansion) 创造了 50 多个游戏。SCUMM 是一个强大的 冒险游戏 开发语言,但是它有一些局限性。SCUMM 是十多年前写的,它缺少一些现代语言的特性。

尽管 SCUMM 有持续的补丁和维护,它也没有办法像其它语言一样健壮和有完备的功能了。

为什么选择 Python

我们有过创造一种新型的、现代的 私有语言的想法,但最终明智地放弃了这种想法。我们的职责是在做游戏,而不语言。

我们在每年花费大量开销维护一套私有工具的情况下,确实希望使用一种已有的脚本语言而不是重新创造一种。使用已有语言更快地投入工作,花费更少的开销,并且通常情况下要比我们创造的好,并且以后会发展地更好,即使我们不用它工作。

一旦我们决定要使用已有的脚本语言,就需要从中选择一种。我们需要一种支持 面向对象编程,并且能嵌入到我们游戏中的语言,而且它不存在任何技术和许可授权上的问题。

我们考虑了 Lua [Lua01] 和 Python [Python02],这两种语言已经被应用在某些游戏中了。

Lua 较小,更加容易嵌入到应用程序中,并且有一些很棒的语言结构。但是,那时我们发觉 Lua 的文档有些粗略,这大概是因为 Lua 是比 Python 更新的语言。

Python 比 Lua 有更多的扩展模块,更多的参考书籍,并且 stackless Python [Tismer01] 很适合为对象 AI 创建微线程[TR3: micro-threads]。最后我们没有选择 Python 的 stackless 版本,但开始用 Python 写自动生成脚本,这给了我们继续使用 Python 的动力。当了解了 Python 后,我们喜欢上了它的语法,最后选择了它。

在我们决定之后,这两种语言都发生了改进:Lua 已经变成 stackless,而 Python 有了生成器,这个能提供一些相似的功能。现在任何一种都是安全的选择。

谁在游戏中使用了 Python

Python 已经被使用在很多游戏中,包括:

  • ToonTown - http://www.toontown.com/
  • EveOnline - http://www.eve-online.com/
  • Blade of Darkness - http://www.codemastersusa.com/blade/

还有很多其它的游戏,只是我们很难确认,例如至少有一个 PS2 游戏使用了 Python。

同时 Python 也至少用在两个游戏引擎中:

  • Game Blender - http://www.blender.nl/gameBlenderDoc/python.html
  • PyGame - http://www.pygame.org/

一个生成脚本示例

下面是一段 Python 代码示例,它是一个递归生成所有 VC++ 工作区的简单生成脚本。它只有以下几行:

源码打印?

在这里插入图片描述
加上更多的代码,可以让这个脚本 [Dawson02] 分析输出结果,然后给团队中的每个人发送一份结果报告邮件。不像某些其它脚本语言,上面代码有很好的可读性。使用 Python 来写生成脚本和游戏脚本将会省却很多学习的时间。

这个生成脚本示例也显示了一些对 Python 新手很头疼的问题。Python 的流程控制由缩进指明,而不使用 begin/end 声明或大括号。

我用了很短的时间来适应这种规则,最后我发现这种规则很有效。我曾经不止一次讨论过 C/C++ 中的大括号应该写在哪里,我想 Python 程序员有更高的工作效率,因为他们不用花费时间争论 K&R 及其它缩进风格[TR4: indenting style] 的事情。因为代码块由缩进定义,编写时便不会出现任何不符合 Python 编译器规则的缩进(因为那样的话,程序就会出错)。

要注意的是,当你混用 TAB 和空格进行缩进时,可能出现问题。大多数程序员使用宽度为 3 个或 4 个空格的 TAB 缩进,但是在 Python 编译器内部却使用 8 个空格的缩进,混合使用 TAB 和空格可能导致语法错误。如果你完全地使用空格或 TAB 进行缩进,并且使用一个能够提示混用空格、TAB 缩进警告的 IDE,那么便没有什么问题。

游戏脚本示例

下面的示例是我们的第一个 Python/C++ 游戏中的一些 Python 代码。这些代码是 Python 正在执行的一个主循环,它调用了其它的模块,这些模块甚至可以用其它语言编写:

源码打印?

在这里插入图片描述

游戏程序员能够想到的一个很棒的事情是,如果 UpdateAI() 跑起来很慢,那么可以用 C++ 来重写它。为了做到这点,在 gameai.py 中的函数和类型需要用 C++ 实现,并且在 Python 中注册为原先的模块名。之后,使用者能够继续导入并使用 gameai 模块,而不需要任何更改。

因此,Python 模块能够帮你简单地用 Python 搭建你的整个游戏框架,而在适当的地方用 C++ 代码实现。

粘合代码 (Glue Code)

如果你自己手工编写让 C++ 代码和 Python 协同工作的粘合代码,那将是一件枯燥繁琐的事情 [TR5: glue code]。一个能够产生粘合代码的系统框架是很重要的。

Swig, Boost, CXX 等 [Abrahams01] 能帮你产生代码,更方便地将 Python 和 C++ 粘合起来。还有 Fubi[Bilas01],它是一个通用的框架,可以将 C++ 的函数和类映射到一种脚本语言中。

早期,大多数这些粘合代码框架都依靠分析 C++ 头文件工作。因此,它们受到暴露的 C++ 头文件的限制,并且一些框架不支持从 C++ 类派生出 Python 类。后来,这些框架都有所改进,所以现在还是值得考虑的。

而我们决定做一个自己的方案,它可以根据类的 IDL 描述或导出函数来生成粘合代码。它的代码叫做 Yaga,是一个递归命名法,表示 Yaga is A Game Architecture。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

六、Python练习题

检查学习结果。
在这里插入图片描述

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Python资料、技术、课程、解答、咨询也可以直接点击下面名片,添加官方客服斯琪

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值