电子游戏是许多人喜爱甚至沉迷的事情。尤其对于程序员来说,开发游戏是不少人最初学习编程的动力。在之前,我发过一些游戏开发的教程和案例:
- 爆款游戏《贪吃蛇大作战》的 Python 实现
- 如何用100行Python代码做出魔性声控游戏“八分音符酱”
- 熬夜写了一个小游戏,向SpaceX聊表敬意
- 王校长一分钟能吃多少热狗?| 小游戏
- 《pygame入门教程》(公众号 Crossin的编程教室 回复关键字 pygame)
游戏开发也是学习编程的一个很好方式,代码上的各种增加和改动会立刻有直观的反馈,让你的学习过程显得不那么枯燥。
不过游戏开发和一般编程初学时接触的程序开发模式有一定的区别,刚上手可能很不适应。我发现网上的游戏开发教程大多是从某种语言或引擎的开发细节入手,而没有一个提纲挈领式的整体介绍。作为一个有不少年游戏开发经验的开发者,我今天就分享下这方面的经验。
电子游戏的原理
电子游戏的原理其实和电影的原理是一样的,都是利用人的“视觉暂留”和“似动现象”,使原本离散的静止图像,看起来是连续的动态效果。
这种翻页动画就是最好的例子。只不过电影通过胶片和放映机把它自动化了,而电子游戏更进一步:不但可以自动连续播放,而且过程中你可以去控制画面中的内容。这有赖于计算机程序的实现,但本质是相通的。
我们平常玩的游戏,其实都是一张张图像连续播放而成。播放的快慢,就是我们经常听到的“帧率”(FPS)。当你的电脑配置跟不上游戏的要求,运行帧数很低时,会被戏称为“幻灯片”,也正是由于这个原因。
基于此,游戏程序的代码在结构上就和一般的程序就有了明显的区别,就是:
主循环
对于游戏来说,需要有一个不停执行的循环,不停产生图像,并把它显示到屏幕上。在我们 pygame 的教程中,你可以很明显地看到这个:
while True:
...
在主循环里进行的各种读写、计算、处理、渲染……构成了游戏的每一帧。有一类游戏开发岗位常见的面试题,我面试 Ubisoft 的时候被问到过,后来也用来问过很多应聘者:
以一个 FPS 游戏为例,列举游戏在一帧内需要处理哪些事情?
给出一份我的参考答案:
- 事件响应,主要是用户的输入。如键盘按键、鼠标移动、鼠标点击、语音等。
- 更新游戏内元素的运动状态,这一环节大多由物理引擎处理。如移动、下落、惯性等。
- 碰撞检测,以及碰撞后的事件响应。如子弹击中角色、拾取物品等。
- 电脑角色(NPC)的行为,即电脑 AI。
- 网络请求、数据更新、同步等,判定游戏得分及胜负。
- 计算或播放动画效果。如人物动作、爆炸特效、树木水面等环境效果。
- 渲染场景画面,包括光照效果等,即生成最终显示的画面。
这一些列动作需要用到大量 CPU 和 GPU(显卡)的计算。计算的快慢决定了游戏一帧的耗时。通常最耗时的操作在于实时的动画计算和光照渲染。这就是为什么当你玩游戏卡顿时,可以通过调低画面效果、关闭软阴影/抗锯齿、降低模型质量等方法改善,或者,买一块更强大的显卡……
游戏程序的主体结构抽象来说就是这样一个流程:
这里提一个小细节,就是如果我们计算运动是按照每一帧更新固定的长度来计算,就会出现运算速度快的电脑上帧数很高,运动就很快,反之差的电脑上就很慢(我们 pygame 教程里的打飞机游戏就是如此)。通常的解决方法,一种是固定帧数,大家都是30帧运行;还有一种就是对运动速度进行修正,最简单的办法就是以固定值乘以上一帧实际消耗的时间。
游戏中的设计模式
谈了游戏程序的整体结构,我再来说几个游戏开发中常用设计理念和模式。
首先是面向对象。因为游戏大多是对现实场景的模拟和抽象,含有众多角色和道具,所以它比其他程序更适合使用面向对象的设计。不少企业在面试时也会用游戏角色的设计来考察面向对象的概念。比如:一个兵种就是一个类,它有父类(角色),有子类(细分兵种),有属性(血量、攻击),有方法(攻击、死亡)。
MVC模式(Model-View-Controller),即把模型、视图、控制器分离开的设计。在游戏开发中,通过 MVC 模式,将游戏玩家、场景及角色的数据(Model)、游戏画面和菜单的显示(View)、游戏的输入控制和逻辑处理(Controller)分离开,会让程序的架构更合理,容易维护和扩展。
状态机。游戏中的角色,经常会有多种状态的切换,比如第一人称射击游戏中的站立、跑动、开镜、下蹲、卧倒等。如果简单的通过一堆 if-else 来管理各种状态的切换,会让代码十分繁琐很难以维护。这时候可以了解下状态机模式。
游戏开发之路
在实际的开发中,几乎没有团队是从零开始写一个游戏,或多或少都会使用或自研游戏引擎。所谓游戏引擎,就是把我们前面说到的一些游戏中的通用工作,比如输入处理、物理引擎、动画、场景渲染、网络交互等部分封装起来,让开发者可以专注于游戏本身玩法的开发。像之前提过的 Cocos、Unity,包括 pygame 都属于游戏引擎的范畴,只不过各自的形式和侧重点有所不同。
在引擎之上,游戏开发团队还会为游戏制作专门的编辑器,以方便游戏策划人员编辑关卡和数值。如果你捣鼓过暴雪的魔兽争霸、星际争霸之类的编辑器,对此一定深有感触。
一个最简单的游戏团队,一般也有三类人:策划、程序、美术。这是游戏开发不可或缺的三个部分。策划负责游戏的玩法、数值、关卡、剧情等设计,程序负责实现功能以及开发相关工具,美术负责各种视觉素材。再多一点可能还会有专门的动画和音效人员;也有个人独立开发者所有工作一肩挑。而如今的大制作游戏,团队则要庞大许多,各种细化分工就远不止这些了。
如果你有志于从事游戏行业,或者想开发出属于自己的游戏,我给出一点建议:
- 了解游戏开发的基础,一般游戏引擎都有官方教程,跟着做
- 打牢编程基础,包括数据结构、算法、设计模式等
- 多了解各方面的知识,多点兴趣爱好,不仅仅是玩游戏。这对于写代码或许没有直接帮助,但如果你想做自己的游戏,这些将会派上用场
- 多写。不要纠结太多,就从最弱最简单的小游戏开始写,一个接一个的写。坚持下去,并不会太久,量变就会产生质变。
以上是我关于游戏开发的经验与分享。你若有其他想了解的,欢迎留言讨论。
════
其他文章及回答:
编程实训 | 如何自学Python | 新手引导 | 精选Python问答 | Python单词表 | 人工智能 | 爬虫 | 我用Python | requests | 计算机视觉
欢迎搜索及关注:Crossin的编程教室