你的游戏开发第0课

电子游戏是许多人喜爱甚至沉迷的事情。尤其对于程序员来说,开发游戏是不少人最初学习编程的动力。在之前,我发过一些游戏开发的教程和案例:

  • 爆款游戏《贪吃蛇大作战》的 Python 实现
  • 如何用100行Python代码做出魔性声控游戏“八分音符酱”
  • 熬夜写了一个小游戏,向SpaceX聊表敬意
  • 王校长一分钟能吃多少热狗?| 小游戏
  • 《pygame入门教程》回复关键字 pygame

游戏开发也是学习编程的一个很好方式,代码上的各种增加和改动会立刻有直观的反馈,让你的学习过程显得不那么枯燥。

不过游戏开发和一般编程初学时接触的程序开发模式有一定的区别,刚上手可能很不适应。我发现网上的游戏开发教程大多是从某种语言或引擎的开发细节入手,而没有一个提纲挈领式的整体介绍。作为一个有不少年游戏开发经验的开发者,我今天就分享下这方面的经验。

电子游戏的原理

电子游戏的原理其实和电影的原理是一样的,都是利用人的“视觉暂留”和“似动现象”,使原本离散的静止图像,看起来是连续的动态效果。

这种翻页动画就是最好的例子。只不过电影通过胶片和放映机把它自动化了,而电子游戏更进一步:不但可以自动连续播放,而且过程中你可以去控制画面中的内容。这有赖于计算机程序的实现,但本质是相通的。

我们平常玩的游戏,其实都是一张张图像连续播放而成。播放的快慢,就是我们经常听到的“帧率”(FPS)。当你的电脑配置跟不上游戏的要求,运行帧数很低时,会被戏称为“幻灯片”,也正是由于这个原因。

基于此,游戏程序的代码在结构上就和一般的程序就有了明显的区别,就是:

主循环

对于游戏来说,需要有一个不停执行的循环,不停产生图像,并把它显示到屏幕上。在我们 pygame 的教程中,你可以很明显地看到这个:

while True:
    ...

在主循环里进行的各种读写、计算、处理、渲染……构成了游戏的每一帧。有一类游戏开发岗位常见的面试题,我面试 Ubisoft 的时候被问到过,后来也用来问过很多应聘者:

以一个 FPS 游戏为例,列举游戏在一帧内需要处理哪些事情?

给出一份我的参考答案:

  1. 事件响应,主要是用户的输入。如键盘按键、鼠标移动、鼠标点击、语音等。
  2. 更新游戏内元素的运动状态,这一环节大多由物理引擎处理。如移动、下落、惯性等。
  3. 碰撞检测,以及碰撞后的事件响应。如子弹击中角色、拾取物品等。
  4. 电脑角色(NPC)的行为,即电脑 AI
  5. 网络请求、数据更新、同步等,判定游戏得分及胜负。
  6. 计算或播放动画效果。如人物动作、爆炸特效、树木水面等环境效果。
  7. 渲染场景画面,包括光照效果等,即生成最终显示的画面。

这一些列动作需要用到大量 CPU GPU(显卡)的计算。计算的快慢决定了游戏一帧的耗时。通常最耗时的操作在于实时的动画计算和光照渲染。这就是为什么当你玩游戏卡顿时,可以通过调低画面效果、关闭软阴影/抗锯齿、降低模型质量等方法改善,或者,买一块更强大的显卡……

游戏程序的主体结构抽象来说就是这样一个流程:

这里提一个小细节,就是如果我们计算运动是按照每一帧更新固定的长度来计算,就会出现运算速度快的电脑上帧数很高,运动就很快,反之差的电脑上就很慢(我们 pygame 教程里的打飞机游戏就是如此)。通常的解决方法,一种是固定帧数,大家都是30帧运行;还有一种就是对运动速度进行修正,最简单的办法就是以固定值乘以上一帧实际消耗的时间

游戏中的设计模式

谈了游戏程序的整体结构,我再来说几个游戏开发中常用设计理念和模式。

首先是面向对象。因为游戏大多是对现实场景的模拟和抽象,含有众多角色和道具,所以它比其他程序更适合使用面向对象的设计。不少企业在面试时也会用游戏角色的设计来考察面向对象的概念。比如:一个兵种就是一个类,它有父类(角色),有子类(细分兵种),有属性(血量、攻击),有方法(攻击、死亡)。

MVC模式(Model-View-Controller),即把模型、视图、控制器分离开的设计。在游戏开发中,通过 MVC 模式,将游戏玩家、场景及角色的数据(Model)、游戏画面和菜单的显示(View)、游戏的输入控制和逻辑处理(Controller)分离开,会让程序的架构更合理,容易维护和扩展。

状态机。游戏中的角色,经常会有多种状态的切换,比如第一人称射击游戏中的站立、跑动、开镜、下蹲、卧倒等。如果简单的通过一堆 if-else 来管理各种状态的切换,会让代码十分繁琐很难以维护。这时候可以了解下状态机模式。

游戏开发之路

在实际的开发中,几乎没有团队是从零开始写一个游戏,或多或少都会使用或自研游戏引擎。所谓游戏引擎,就是把我们前面说到的一些游戏中的通用工作,比如输入处理、物理引擎、动画、场景渲染、网络交互等部分封装起来,让开发者可以专注于游戏本身玩法的开发。像之前提过的 Cocos、Unity,包括 pygame 都属于游戏引擎的范畴,只不过各自的形式和侧重点有所不同。

在引擎之上,游戏开发团队还会为游戏制作专门的编辑器,以方便游戏策划人员编辑关卡和数值。如果你捣鼓过暴雪的魔兽争霸、星际争霸之类的编辑器,对此一定深有感触。

一个最简单的游戏团队,一般也有三类人:策划、程序、美术。这是游戏开发不可或缺的三个部分。策划负责游戏的玩法、数值、关卡、剧情等设计,程序负责实现功能以及开发相关工具,美术负责各种视觉素材。再多一点可能还会有专门的动画和音效人员;也有个人独立开发者所有工作一肩挑。而如今的大制作游戏,团队则要庞大许多,各种细化分工就远不止这些了。

如果你有志于从事游戏行业,或者想开发出属于自己的游戏,我给出一点建议:

  1. 了解游戏开发的基础,一般游戏引擎都有官方教程,跟着做
  2. 打牢编程基础,包括数据结构、算法、设计模式等
  3. 多了解各方面的知识,多点兴趣爱好,不仅仅是玩游戏。这对于写代码或许没有直接帮助,但如果你想做自己的游戏,这些将会派上用场
  4. 多写。不要纠结太多,就从最弱最简单的小游戏开始写,一个接一个的写。坚持下去,并不会太久,量变就会产生质变。

以上是我关于游戏开发的经验与分享。你若有其他想了解的,欢迎留言讨论

原文发布于微信公众号 - Crossin的编程教室(crossincode)

原文发表时间:2018-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网数据官iCDO

教你5招快速掌握SEO基本技巧!

这个数据告诉我们,SEO永远都重要。如果你从事营销工作,或运营一个博客,或是经营自己的生意,知道SEO的基础知识是非常重要的。

11940
来自专栏华章科技

大数据商业智能的十大戒律

如今,各路企业和组织都不再使用上一代架构来存储大数据。既然如此,为什么还要使用上一代商业智能(BI)工具来进行大数据分析呢?在为企业选择BI工具时,应该遵守以下...

11120
来自专栏大数据文摘

【干货】吴甘沙清华讲:大数据的10个技术前沿(上)

19450
来自专栏LiveEdu在线科技教育平台

编程语言五花八门,哪种可以让程序员赚到更多钱?

在众多行业中,程序员属于高薪职业。无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作岗位。高薪的诱惑和充满挑战性的工作,令程序员一直成为备受欢迎的职业...

38570
来自专栏互联网杂技

2018年的用户体验状况

这是由一位美国作者站在美国的视角写的文章,即便抛开个人因素不谈,国内外的发展进度并不完全同步。例如情感化反馈这一块也许国内稍稍落后一点、但是移动支付和AR却要快...

30180
来自专栏VRPinea

那些科技圈的弄潮儿不得不知道的VR剪辑软件!

45370
来自专栏机器之心

资源 | 关于大数据,你应该知道的75个专业术语

选自DataConomy 机器之心编译 近日,Ramesh Dontha 在 DataConomy 上连发两篇文章,扼要而全面地介绍了关于大数据的 75 个核心...

41860
来自专栏PPV课数据科学社区

小数据分析:微博前端大战

最近前端针对某些问题展开了非常激烈的讨论,作为一名围观了全过程的前端新手表示,从中学习到了很多东西。 围观之余,想尝试理性地通过数据分析进行舆论统计,从机器的角...

33050
来自专栏数据小魔方

数据可视化经典案例|让数据说话

今天跟大家分享一个经典的数据可视化案例! 案例的主角是汉斯.罗斯林(Hans Rosling)教授。 它是卡罗琳学院的国际卫生学教授,并担任Gapminder基...

45760
来自专栏ThoughtWorks

浅谈软件项目规模估计——怎么估?

做事所花费的时间总是比你预期的要长,即使你的预期中考虑了侯世达定律。 —— 侯世达,哥德尔、埃舍尔、巴赫 ? 周三的下午,我像平常一样,写着代码听着歌,突然从...

41840

扫码关注云+社区

领取腾讯云代金券