一款制作精良的游戏常常会让人流连其中,乃至废寝忘食,这时人们常常会好奇,这些游戏到底是怎么做出来的?本书用通俗易读的方式回答了上面这个问题。
移动设备的普及让电子游戏的流行达到了一个前所未有的高度,然而在这个公交地铁都被游戏占领的时代,关于电子游戏本身的制作原理却并不为人们所知晓。一款制作精良的游戏常常会让人流连其中,乃至废寝忘食,这时人们常常会好奇,这些游戏到底是怎么做出来的?本书正是希望回答上面这个问题。
这本书由十个短篇组成,每篇围绕着不同的主题,介绍游戏开发的原理和过程。本书并不是为专业的游戏制作者们写的,相反,它是以科普为主要目的,更加强调易读性,而不是细致性,旨在给非行业内的读者们一个大概的介绍。看完这个系列的文章后,当你再次进入一款游戏的时候,你或许会有不同的感受。
本文是游戏《夏季频道》的制作人林博昱的科普作品《取悦的工序:如何理解游戏》中的第一章,触乐与作者联系获得授权。全书共有十章,触乐将会陆续转载。
在说正题之前,先说说动画。
细说起来,我接触动画挺早的。初中那会,在上天的眷顾之下,我拥有了一个爱画黄色漫画的同桌,也正是在他的引领下,我接触到了动画。他常用铅笔在课本右下角勾一些线条,通常都是两个小人变身互放龟波气功的场景,等每页都画上了,用手一撩拨,噼里啪啦地就放出了一段精彩的动画。
多年以后,他到一家游戏公司做美术设计,而我也终于知道,这就是传说中的逐帧动画。
怎么理解逐帧动画呢?
想象一下你把一个西瓜往天上扔,同时让远处的小伙伴给它来个疯狂十连拍。一阵卡擦过后,你就得到了十张照片。一旦这些照片以足够的速度在你眼前逐张闪过,我们就会看到一个西瓜做抛体运动(东西被往天上甩时所作的运动)的动画。
我们把这些照片里的每一张叫做一帧;而这些照片闪过的速度,则是用帧率来衡量,我们说一个动画帧率为24FPS,就是说它一秒钟会播放24帧。
那么,游戏跟动画有什么区别?
我们以半块砖工作室开发的风靡全球的游戏——《水果忍者》为例,来说明一下这个问题。
当你在iPhone上玩这款游戏的时候,你的iPhone会以每秒几十帧的速度在屏幕上画西瓜,由于每帧里西瓜的位置不同——刚开始西瓜被画在屏幕左下角,过一会它被画在屏幕上部,最后又被画在右下角——你最后就看到了一个正在做抛体运动的西瓜。
那么,一个显而易见的问题来了:这些帧又不是十连拍拍下来的,它们是怎么画出来的?或者说,这西瓜怎么就知道自己要做抛体运动?它怎么就不飞出屏幕去或者飞一半自己爆掉呢?
答案是你的iPhone在两帧之间的空隙处做了很多工作,这些工作决定了这个西瓜的行为,我们把这些工作叫做计算。
假设第一帧的时候西瓜位于左下角,iPhone把这一帧画完后,就得开始思考下一帧它得画在哪这个问题。回顾一下你曾经学过的经典物理课程:如果我们知道一个东西此刻的位置、速度和加速度,就可以计算出若干时间(例如一帧)后它所处的新位置。你的iPhone正是根据西瓜第一帧的物理参数,来计算它下一帧的位置,一旦算出来了,它才开始画下一帧。
当然,计算这件事实际上是由程序员们写的代码来实现的。不同的游戏需要计算不同的东西,比如《反恐精英》需要计算弹道轨迹、《极品飞车》需要计算赛道摩擦、《瘟疫公司》需要计算病毒扩散。他们都有自己的一套代码。
诸如位置、速度这一大坨参数,在游戏开发里我们管它们叫做状态。某一帧的状态决定了这一帧的画面。所谓的计算,实际上就是一个状态到另一个状态的变化,而整个游戏的运行,则是状态不断变化,画面也跟着不断变化的过程。
这种状态不断变化的东西叫做状态机。游戏在本质上就是一个状态机。
游戏跟动画之间最大的区别也正在于此。对于动画来说,它只要把每一帧的画面依次显示出来就可以了,但游戏需要在两个帧之间进行计算,在计算出新的状态后,才能渲染。
OK,现在我们知道游戏世界里那个西瓜是怎么知道自己要做抛体运动的,但还有个无聊的问题:刚才在真实世界里被你抛到天上的那个能吃的西瓜,又是怎么知道自己要做抛体运动呢?它怎么不飞出地球或者飞一半自己爆掉呢?
这个问题似乎还没有答案。有一些物理学家和哲学家认为这个世界的一切事物本质上都是信息,而整个宇宙则是一次不断计算着的游戏。类似的想法在艺术领域催生了很多有名的作品,比如大家熟悉的《黑客帝国》和《盗梦空间》。事实上,我们的宇宙的确有一个最小的时间单位,叫做普朗克时间,约为5.39e-44秒。这么看来,如果宇宙真是一款游戏,这帧率还挺高,应该不卡——不过谁知道呢。
跟其它艺术形式相比,游戏在构建虚拟世界这事上有得天独厚的优势。因为它们在本质上是一个状态机,所以这个虚拟世界可以有自己的规则,就好像真实的世界有各种科学定律一样,而更出彩的是,这个虚拟世界不是封闭的,它可以接受来自外界的信息——当你的手指在屏幕上划过时,那个西瓜就会啪地爆开。这是我们在下篇文章里要说的用户事件。