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