如何理解游戏:游戏与动画的不同及游戏内事件的实现

>>>  創業先鋒 眾人拾柴火焰高  >>> 簡體     傳統

  文/ 林博昱  授权GameRes游资网发布。林博昱,游戏制作人,大约三四年的从业经验。两年前牵头成立了一个创业团队,致力于休闲游戏的开发。

  喜欢玩游戏的人很多,但游戏作为一门复杂的艺术形式,它的生产原理并不被广大玩家们所理解;而游戏开发团队里的设计、美术、运营等非技术类的从业者,很多时候也会对游戏开发的原理产生疑问。

  我常常为上述第二件事感到苦恼,因为这是一个看似正常实则对游戏最终品质有很大影响的状况。为了解决这个苦恼,我给这些非技术类的同事们讲了几节课,试图用比较浅显的语言和更加具象化的表述来讲述技术上的来龙去脉。积累了一段时间后,就有了这个系列的几篇短文。每篇短文针对游戏开发中的某个特定主题,做一个浅显的介绍。

  游戏和动画有什么不同?

  在说正题之前,先说说动画。

  细说起来,我接触动画挺早的。初中那会,在上天的眷顾之下,我拥有了一个爱画黄色漫画的同桌,也正是在他的引领下,我接触到了动画。他常用铅笔在课本右下角勾一些线条,通常都是两个小人变身互放龟波气功的场景,等每页都画上了,用手一撩拨,噼里啪啦地就放出了一段精彩的动画。

  多年以后,他到一家游戏公司做美术设计,而我也终于知道,这就是传说中的逐帧动画。

  怎么理解逐帧动画呢?


  想象一下你把一个西瓜往天上扔,同时让远处的小伙伴给它来个疯狂十连拍。一阵卡擦过后,你就得到了十张照片。一旦这些照片以足够的速度在你眼前逐张闪过,我们就会看到一个西瓜做抛体运动(东西被往天上甩时所作的运动)的动画。

  我们把这些照片里的每一张叫做一帧;而这些照片闪过的速度,则是用帧率来衡量,我们说一个动画帧率为24FPS,就是说它一秒钟会播放24帧。

  那么,游戏跟动画有什么区别?

  我们以半块砖工作室开发的风靡全球的游戏——《水果忍者》为例,来说明一下这个问题。


  当你在iPhone上玩这款游戏的时候,你的iPhone会以每秒几十帧的速度在屏幕上画西瓜,由于每帧里西瓜的位置不同——刚开始西瓜被画在屏幕左下角,过一会它被画在屏幕上部,最后又被画在右下角——你最后就看到了一个正在做抛体运动的西瓜。

  那么,一个显而易见的问题来了:这些帧又不是十连拍拍下来的,它们是怎么画出来的?或者说,这西瓜怎么就知道自己要做抛体运动?它怎么就不飞出屏幕去或者飞一半自己爆掉呢?

  答案是你的iPhone在两帧之间的空隙处做了很多工作,这些工作决定了这个西瓜的行为,我们把这些工作叫做计算。

  假设第一帧的时候西瓜位于左下角,iPhone把这一帧画完后,就得开始思考下一帧它得画在哪这个问题。回顾一下你曾经学过的经典物理课程:如果我们知道一个东西此刻的位置、速度和加速度,就可以计算出若干时间(例如一帧)后它所处的新位置。你的iPhone正是根据西瓜第一帧的物理参数,来计算它下一帧的位置,一旦算出来了,它才开始画下一帧。

  当然,计算这件事实际上是由程序员们写的代码来实现的。不同的游戏需要计算不同的东西,比如《反恐精英》需要计算弹道轨迹、《极品飞车》需要计算赛道摩擦、《瘟疫公司》需要计算病毒扩散。他们都有自己的一套代码。

  诸如位置、速度这一大坨参数,在游戏开发里我们管它们叫做状态。某一帧的状态决定了这一帧的画面。所谓的计算,实际上就是一个状态到另一个状态的变化,而整个游戏的运行,则是状态不断变化,画面也跟着不断变化的过程。

  这种状态不断变化的东西叫做状态机。游戏在本质上就是一个状态机。

  游戏跟动画之间最大的区别也正在于此。对于动画来说,它只要把每一帧的画面依次显示出来就可以了,但游戏需要在两个帧之间进行计算,在计算出新的状态后,才能渲染。

  OK,现在我们知道游戏世界里那个西瓜是怎么知道自己要做抛体运动的,但还有个无聊的问题:刚才在真实世界里被你抛到天上的那个能吃的西瓜,又是怎么知道自己要做抛体运动呢?它怎么不飞出地球或者飞一半自己爆掉呢?

  这个问题似乎还没有答案。有一些物理学家和哲学家认为这个世界的一切事物本质上都是信息,而整个宇宙则是一次不断计算着的游戏。类似的想法在艺术领域催生了很多有名的作品,比如大家熟悉的《黑客帝国》和《盗梦空间》。事实上,我们的宇宙的确有一个最小的时间单位,叫做普朗克时间,约为5.39e-44秒。这么看来,如果宇宙真是一款游戏,这帧率还挺高,应该不卡——不过谁知道呢。

  跟其它艺术形式相比,游戏在构建虚拟世界这事上有得天独厚的优势。因为它们在本质上是一个状态机,所以这个虚拟世界可以有自己的规则,就好像真实的世界有各种科学定律一样,而更出彩的是,这个虚拟世界不是封闭的,它可以接受来自外界的信息——当你的手指在屏幕上划过时,那个西瓜就会啪地爆开。这是我们在下篇文章里要说的用户事件。

  西瓜是怎样被切掉的?

  你正在玩《水果忍者》,一个西瓜飞了上来。

  看完上面游戏和动画有什么不同?,你就会知道,你的iPhone这时正在努力地把这个西瓜从一个状态变到另一个状态。

  如果你忘记了,没关系,我们先简单回顾一下什么叫状态。

  所谓的状态就是游戏里的参数,例如刚才这位西瓜,它的位置就是一个参数。状态会随着时间变化:一开始这个西瓜的位置在屏幕的左下角,过一会儿它的位置在屏幕正上方,再过一会儿它又移到屏幕右下角去了。西瓜的位置在变,等于说游戏的状态在变,每变化到一个新状态,游戏都会根据这个状态下的参数,把西瓜重新画到屏幕上,然后,iPhone继续计算出下一个状态的参数,如此循环不息,游戏就一直运行下去。

  ok,上面其实就讲了这么个事,现在,我们讨论下西瓜是怎么被切掉的。


  如上所述,当西瓜飞上来时,游戏正在从一个状态跳到下一个状态,这时,你的iPhone突然感到自己被人划了一下,敏感的它会立刻把「擦,我被划了一下」这件事通知游戏。

  具体怎么通知呢?它把这件事插入到当前状态之后。

  本来如果没这事,游戏画完当前这一帧后就会跳到下一状态,现在出了这事,它画完当前帧后就没法立刻跳到下个状态,它得先处理这个事,等处理完了,再跳到下一个状态。所以我们说,「我被划了一下」这件事被插入到两个状态之间。

  那么,一个很自然的问题是:游戏怎么处理这件事?

  事实上,游戏对这件事的处理,本质上还是在改变西瓜的参数。我们假设西瓜除了「位置」以外,还有一个叫做「爆否」的参数,在处理这个事件的时候,游戏把这个参数由原来的0(表示没爆)改写成1(表示爆啦)。改写完后,游戏就把这事忘记了,继续跳到下一个状态。在新的状态里,游戏照例会根据参数来画西瓜。这时,它猛然发现「爆否」这个参数居然不等于0,而是等于1!天哪!这意味着这个西瓜爆了!尽管对这个西瓜满怀不舍,游戏还是不得不把西瓜爆掉的画面画出来,因为画面是由状态说了算的。所以西瓜就是这么被切掉的。

  导致西瓜被切掉的,是「iPhone被划了一下」这件事,这在游戏开发里叫用户事件,从游戏者的角度来看,用户事件则是由输入设备触发的。

  随着游戏设备越来越丰富,输入方式也越来越多:从红白机的手柄,电脑的鼠标键盘,到移动设备的触控和重力感应,再到狂拽炫酷的体感设备,不一而足。想象一下声控的Flappy Bird吧,喊一声跳一下,是不是很欢乐。

  电影《阿凡达》里,主角自己无法站起来,但他能通过意识输入来控制Avatar,就像在玩一款游戏。Avatar这个词来自印度教,有神灵下凡、附体的意思。所以当你点开《神庙逃亡》,用你牛逼闪闪的操作控制着主角左蹦右跳时,背后的魔鬼肯定吐槽:神人附体啊卧槽。

  在游戏和动画有什么不同?里,我们说游戏本质上是状态机,现在我们可以说,它是一个可以和人互动的状态机。它接收来自游戏者的信息, 改变自身状态,通过画面或声音把新的状态告诉游戏者,游戏者又根据这些画面输入新的信息,如此往复,造就了游戏里的另一个循环。



GameRes游资网 2015-08-23 08:46:47

[新一篇] 初創公司避免瞎折騰的六個關鍵點

[舊一篇] 手游運營人員的18條軍規
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表