《取悦的四工序开料机:如何理解游戏》发布

新游最前线
6月11日新服
不删档532区
终结者2审判日
恋与制作人
决战!平安京
阿瓦隆之王
《勇者前线》续作《Dolls Order》即将开测
反差萌《怪兽娘~超特训大作战~》已上架
解谜手游《伯特伦·费德历险记第2集》上架
在银河间垂钓?《天海之间》繁中版2月上线
回力卜推出益智手游《奇诺多与无尽之塔》
火爆策略机战游戏《扫荡机器人》曝光
SE童话RPG《格林笔记Repage》开启事前登录
Bushiroad新作《Triple MonsterS》预计年内上线
独立神作《Inside》安卓版即将上架
锈湖系列新作《锈湖:天堂岛》1月11日上线
《黑色沙漠》手游预计1月首测
极简风解谜《字母人》曝光
拯救手游世界!《终幕彼女》预计今年推出
3D像素风探索游戏《孤高的职人》正式上架
《勇者前线》续作《Dolls Order》即将开测
反差萌《怪兽娘~超特训大作战~》已上架
解谜手游《伯特伦·费德历险记第2集》上架
在银河间垂钓?《天海之间》繁中版2月上线
回力卜推出益智手游《奇诺多与无尽之塔》
火爆策略机战游戏《扫荡机器人》曝光
SE童话RPG《格林笔记Repage》开启事前登录
Bushiroad新作《Triple MonsterS》预计年内上线
独立神作《Inside》安卓版即将上架
锈湖系列新作《锈湖:天堂岛》1月11日上线
《黑色沙漠》手游预计1月首测
极简风解谜《字母人》曝光
拯救手游世界!《终幕彼女》预计今年推出
3D像素风探索游戏《孤高的职人》正式上架
特玩网致力于提供最优质的网络游戏
全平台公测
不删档内测
全平台公测
核弹头小游戏
无需下载,点击即玩
最新下载,一网打尽
原创歪娱乐
热门手游榜
新游期待榜网易一口气发布了 26 款新游戏,还说要砸 6 亿元做直播-CocoaChina_让移动开发更简单
(C)2015 Chukong Technologies,Inc.  喜欢玩游戏的人很多,但游戏作为一门复杂的艺术形式,它的生产原理并不被广大玩家们所理解;而游戏开发团队里的设计、美术、运营等非技术类的从业者,很多时候也会对游戏开发的原理产生疑问。
  我常常为上述第二件事感到苦恼,因为这是一个看似正常实则对游戏最终品质有很大影响的状况。为了解决这个苦恼,我给这些非技术类的同事们讲了几节课,试图用比较浅显的语言和更加具象化的表述来讲述技术上的来龙去脉。积累了一段时间后,就有了这个系列的几篇短文。每篇短文针对游戏开发中的某个特定主题,做一个浅显的介绍。
  游戏和动画有什么不同?
  在说正题之前,先说说动画。
  细说起来,我接触动画挺早的。初中那会,在上天的眷顾之下,我拥有了一个爱画黄色漫画的同桌,也正是在他的引领下,我接触到了动画。他常用铅笔在课本右下角勾一些线条,通常都是两个小人变身互放龟波气功的场景,等每页都画上了,用手一撩拨,噼里啪啦地就放出了一段精彩的动画。
  多年以后,他到一家游戏公司做美术设计,而我也终于知道,这就是传说中的逐帧动画。
  怎么理解逐帧动画呢?
  想象一下你把一个西瓜往天上扔,同时让远处的小伙伴给它来个疯狂十连拍。一阵卡擦过后,你就得到了十张照片。一旦这些照片以足够的速度在你眼前逐张闪过,我们就会看到一个西瓜做抛体运动(东西被往天上甩时所作的运动)的动画。
  我们把这些照片里的每一张叫做一帧;而这些照片闪过的速度,则是用帧率来衡量,我们说一个动画帧率为24FPS,就是说它一秒钟会播放24帧。
  那么,游戏跟动画有什么区别?
  我们以半块砖工作室开发的风靡全球的游戏——《水果忍者》为例,来说明一下这个问题。
  当你在iPhone上玩这款游戏的时候,你的iPhone会以每秒几十帧的速度在屏幕上画西瓜,由于每帧里西瓜的位置不同——刚开始西瓜被画在屏幕左下角,过一会它被画在屏幕上部,最后又被画在右下角——你最后就看到了一个正在做抛体运动的西瓜。
  那么,一个显而易见的问题来了:这些帧又不是十连拍拍下来的,它们是怎么画出来的?或者说,这西瓜怎么就知道自己要做抛体运动?它怎么就不飞出屏幕去或者飞一半自己爆掉呢?
  答案是你的iPhone在两帧之间的空隙处做了很多工作,这些工作决定了这个西瓜的行为,我们把这些工作叫做计算。
  假设第一帧的时候西瓜位于左下角,iPhone把这一帧画完后,就得开始思考下一帧它得画在哪这个问题。回顾一下你曾经学过的经典物理课程:如果我们知道一个东西此刻的位置、速度和加速度,就可以计算出若干时间(例如一帧)后它所处的新位置。你的iPhone正是根据西瓜第一帧的物理参数,来计算它下一帧的位置,一旦算出来了,它才开始画下一帧。
  当然,计算这件事实际上是由程序员们写的代码来实现的。不同的游戏需要计算不同的东西,比如《反恐精英》需要计算弹道轨迹、《极品飞车》需要计算赛道摩擦、《瘟疫公司》需要计算病毒扩散。他们都有自己的一套代码。
  诸如位置、速度这一大坨参数,在游戏开发里我们管它们叫做状态。某一帧的状态决定了这一帧的画面。所谓的计算,实际上就是一个状态到另一个状态的变化,而整个游戏的运行,则是状态不断变化,画面也跟着不断变化的过程。
  这种状态不断变化的东西叫做状态机。游戏在本质上就是一个状态机。
  游戏跟动画之间最大的区别也正在于此。对于动画来说,它只要把每一帧的画面依次显示出来就可以了,但游戏需要在两个帧之间进行计算,在计算出新的状态后,才能渲染。
  OK,现在我们知道游戏世界里那个西瓜是怎么知道自己要做抛体运动的,但还有个无聊的问题:刚才在真实世界里被你抛到天上的那个能吃的西瓜,又是怎么知道自己要做抛体运动呢?它怎么不飞出地球或者飞一半自己爆掉呢?
  这个问题似乎还没有答案。有一些物理学家和哲学家认为这个世界的一切事物本质上都是信息,而整个宇宙则是一次不断计算着的游戏。类似的想法在艺术领域催生了很多有名的作品,比如大家熟悉的《黑客帝国》和《盗梦空间》。事实上,我们的宇宙的确有一个最小的时间单位,叫做普朗克时间,约为5.39e-44秒。这么看来,如果宇宙真是一款游戏,这帧率还挺高,应该不卡——不过谁知道呢。
  跟其它艺术形式相比,游戏在构建虚拟世界这事上有得天独厚的优势。因为它们在本质上是一个状态机,所以这个虚拟世界可以有自己的规则,就好像真实的世界有各种科学定律一样,而更出彩的是,这个虚拟世界不是封闭的,它可以接受来自外界的信息——当你的手指在屏幕上划过时,那个西瓜就会啪地爆开。这是我们在下篇文章里要说的用户事件。
  西瓜是怎样被切掉的?
  你正在玩《水果忍者》,一个西瓜飞了上来。
  看完上一个章节:游戏和动画有什么不同?中,你就会知道,你的iPhone这时正在努力地把这个西瓜从一个状态变到另一个状态。
  如果你忘记了,没关系,我们先简单回顾一下什么叫状态。
  所谓的状态就是游戏里的参数,例如刚才这位西瓜,它的位置就是一个参数。状态会随着时间变化:一开始这个西瓜的位置在屏幕的左下角,过一会儿它的位置在屏幕正上方,再过一会儿它又移到屏幕右下角去了。西瓜的位置在变,等于说游戏的状态在变,每变化到一个新状态,游戏都会根据这个状态下的参数,把西瓜重新画到屏幕上,然后,iPhone继续计算出下一个状态的参数,如此循环不息,游戏就一直运行下去。
  ok,上一篇文章其实就讲了这么个事,现在,我们讨论下西瓜是怎么被切掉的。
  如上所述,当西瓜飞上来时,游戏正在从一个状态跳到下一个状态,这时,你的iPhone突然感到自己被人划了一下,敏感的它会立刻把「擦,我被划了一下」这件事通知游戏。
  具体怎么通知呢?它把这件事插入到当前状态之后。
  本来如果没这事,游戏画完当前这一帧后就会跳到下一状态,现在出了这事,它画完当前帧后就没法立刻跳到下个状态,它得先处理这个事,等处理完了,再跳到下一个状态。所以我们说,「我被划了一下」这件事被插入到两个状态之间。
  那么,一个很自然的问题是:游戏怎么处理这件事?
  事实上,游戏对这件事的处理,本质上还是在改变西瓜的参数。我们假设西瓜除了「位置」以外,还有一个叫做「爆否」的参数,在处理这个事件的时候,游戏把这个参数由原来的0(表示没爆)改写成1(表示爆啦)。改写完后,游戏就把这事忘记了,继续跳到下一个状态。在新的状态里,游戏照例会根据参数来画西瓜。这时,它猛然发现「爆否」这个参数居然不等于0,而是等于1!天哪!这意味着这个西瓜爆了!尽管对这个西瓜满怀不舍,游戏还是不得不把西瓜爆掉的画面画出来,因为画面是由状态说了算的。所以西瓜就是这么被切掉的。
  导致西瓜被切掉的,是「iPhone被划了一下」这件事,这在游戏开发里叫用户事件,从游戏者的角度来看,用户事件则是由输入设备触发的。
  随着游戏设备越来越丰富,输入方式也越来越多:从红白机的手柄,电脑的鼠标键盘,到移动设备的触控和重力感应,再到狂拽炫酷的体感设备,不一而足。想象一下声控的Flappy Bird吧,喊一声跳一下,是不是很欢乐。
  电影《阿凡达》里,主角自己无法站起来,但他能通过意识输入来控制Avatar,就像在玩一款游戏。Avatar这个词来自印度教,有神灵下凡、附体的意思。所以当你点开《神庙逃亡》,用你牛逼闪闪的操作控制着主角左蹦右跳时,背后的魔鬼肯定吐槽:神人附体啊卧槽。
  在《游戏和动画有什么不同?》里,我们说游戏本质上是状态机,现在我们可以说,它是一个可以和人互动的状态机。它接收来自游戏者的信息, 改变自身状态,通过画面或声音把新的状态告诉游戏者,游戏者又根据这些画面输入新的信息,如此往复,造就了游戏里的另一个循环。
  图片是怎么画到屏幕上的?
  在之前谈游戏和动画有什么不同的中,提到过这么一个说法:游戏的状态决定了游戏的画面,这篇文章将继续讨论一下「具体怎么画」这个事情。
  我们知道iPhone5的分辨率是,如果把显示屏上的每个像素都想象成一个格子,那么整个显示屏就像是一个巨大的围棋盘。棋盘上的每一个格子都有自己的颜色。
  什么是颜色呢?人类眼睛的视网膜上有许许多多的视锥细胞,这些视锥细胞可以分成三类,分别对红、绿、蓝三种颜色的光分外敏感。当一抹红色的光射到视网膜上时,对红色光敏感的这些细胞会被刺激到,并向大脑传递红色信号。这意味着,不管我们看到什么颜色的光,我们的大脑只知道红色光有多少,绿色光有多少,蓝色光有多少。因此我们就用三个数字来表示一种颜色:R表示这个颜色有多红、G表示它有多绿、B表示它有多蓝。例如(1, 0,0)表示纯正的红色,(1,1,0)表示红绿各半的颜色,也就是黄色,(0.5, 0.5, 0)表示比较暗的黄色。棋盘上每个格子都有自己的颜色,就是说每个格子都有自己的三个数字。(刚才在搜索资料的时候...
  ok,现在假设你正在开发《涂鸦跳跃》这个游戏。你在PhotoShop里把那个绿色的主角画出来后,你就得到一个图片文件叫「主角.png」。这是一张100x100的图片。跟刚才一样,我们把这张图片想象成一个棋盘,棋盘上每个格子同样也有自己的颜色。如果你用取色器去点主角身上的某个格子,你可以看见这个格子的颜色是(0,1,0)。
  游戏运行的时候,它会不断改变主角的参数,如果某一帧它计算出主角的当前位置是(10,20),那么它该怎么把「主角.png」画到这个位置上呢?
  首先,从iPhone屏幕左下角开始,往右数10格,再往上数20格,找到目标格子;然后,用一个钉子把图片钉在这个目标格子上并挪正,这时图片的格子和屏幕的格子之间就形成一个对应关系;接着,它会把图片上每个格子的颜色值抄一份给屏幕上与之对应的格子,等所有格子都抄完,这幅图片就被画到屏幕上去了。
  图片上那个被钉子穿透了的格子,叫做图片的锚点。锚点可以是图片上的任何一个格子,这取决于你的方便。很显然,同一个位置,不同的锚点,图片是会被画在屏幕上的不同地方的。
  每次游戏计算完当前的状态后,都会得到一个新的位置,然后根据这个位置,按照上面的方法,把图片画到屏幕上去。这样,我们就看到一个动来动去的主角了。
  实际情形当然比这个要复杂很多,除了移动以外,图片还可能做各种变换,例如旋转缩放等,此外还得处理图片的透明度,至于3D模型的渲染,则涉及更复杂的变换,但不管如何,我们都可以把iPhone画图(渲染)的过程,看做是给屏幕上每个格子赋颜色值的过程。格子们根据这个颜色值,发出不同频率、不同强度的光。
  顺便说说前不久刚被Facebook收购的Oculus VR。这家公司研发的显示设备Rift能让穿戴者置身于无边框的虚拟世界中。尽管在分辨率、渲染效率等方面还不够完美,但Rift已能给人们带来及其震撼的视觉感受,很难想象在不久的将来这类设备会在多大程度上提升人们玩游戏、看电影时的体验。试想一下,你通过体感设备输入信息,游戏通过虚拟现实设备反馈状态,别说《极品飞车》,就算是《神庙逃亡》也会玩你一身汗吧。
  游戏进度是如何恢复的?
  前段时间微博上有个很火的游戏《2048》。我们以它为例子,继续谈谈游戏中的状态。如果你没玩过这个游戏,这就点开玩玩吧,我们九个小时后见。
  在之前的文章里,我们聊过状态。所谓状态,就是某一个时刻游戏里所有参数的取值。
  《水果忍者》的参数是某个西瓜的位置或某根香蕉的速度,而《2048》的参数则是格子上的16个数字。在任何一个时刻,游戏的状态都能用16个数字来表示:
  这里0表示这个格子上没有数字。
  游戏运行的时候,你的iPhone会在自己的内存里划出一块空间来存储这16个数字。考虑到这里有少数读者并非程序员,我想有必要解释一下这句话。我们可以把内存想象成一面巨大的墙,墙上有无数个抽屉,每个抽屉里可以放一个数字。刚才那句话的意思就是,你的iPhone会在这面墙上打开16个抽屉,并把上面的16数字依次放进这些抽屉里。做完这件事,《2048》的第一个状态就出现了。接着,游戏开始接收你的输入,改变状态(也就是改变抽屉里的那些数字),接收输入,改变状态,如此循环不息。每一个状态都像是浮生一瞥,转瞬即逝。
  正当你玩得很high的时候,你的好基友打了个电话给你,跟你探讨人为什么要活着这个问题,你们聊了很久,直到手机聊没电了,你才突然想起来自己刚才只差几步就合到2048了!等你颤抖着双手给iPhone插上电源,满怀希望地再次打开游戏:擦!进度没了!
  这是为什么呢?因为iPhone关机重新启动后,内存抽屉里的数字都是会被清理掉的,也就是说你当你重新打开游戏时,它不知道自己上次的状态是什么,只能重新开始。
  那怎么办?没关系,我们还有硬盘。
  我们不妨把硬盘理解成另外一面更大的墙,墙上有更多的抽屉,而这些抽屉里的数字是不会因为iPhone重启而被清理掉的。为了恢复游戏进度,我们得在基友来电的时候,就把内存抽屉里的数字抄一份存在硬盘抽屉里,机子一旦重启了,我们就可以把硬盘抽屉里的数字再抄回到被清空的内存抽屉里来。这样游戏就可以知道机子重启前的状态是什么了。
  这个把数据抄到硬盘里的过程叫做持久化(persistence),顾名思义,它可以让游戏的状态在硬盘里永久性地驻留下来。状态持久化有很多方式,我们可以把这些数据存在文本文件或者是数据库里。假如我们以文本文件的方式来持久化《2048》的状态,那么持久化后,你会在iPhone的硬盘里发现一个叫做「游戏状态.txt」的文件,打开这个文件,你可以在里面发现16个数字。
  这里说一下,这个系列的短文是以易读而不是细致为目的,就说持久化这事,实际上还它涉及数据加密等诸多过程,这里就不一一赘述了;另外,这个系列也并非开发教程,如果一个程序员胆敢把文件命名为「游戏状态.txt」,相信他很快就会被同事们烧掉的。
  说到永驻这个词,很多人都想在前面加上青春两个字。电影《阿凡达》里,主角在影片结束前把它大脑里的所有信息都传输到了Avatar的大脑里,从此过上了幸福而快乐的生活。这个过程有个说法叫Mind Uploading,就是把大脑里的信息传输到其它介质上的意思。未来学家、Google技术总监Ray Kurzweil曾说过,2045年人类就可以把自己的大脑永久化到计算机里面,从而避免死亡。如果有幸(或不幸?)被他言中,那么各位,三十年后,我们内存里见。
  游戏排行榜是如何算出来的?
  当游戏在运行的时候,它把状态存储在内存中,而在某些特定的时刻,例如退出游戏时或者某一局游戏结束时,它会把一些数据抄送到硬盘里,以备将来的需要。在多人游戏里,仅仅把数据抄送到硬盘里并不能解决问题,比如当我们需要一个分数排行榜时,就得想办法收集每个人的分数,这时分数这个数据必须被抄送到一台远程计算机上,这台远程计算机就是服务器。
  我们同样可以把服务器的内存和硬盘想象成一面巨大的墙,墙上有许许多多的抽屉。当你结束一局《水果忍者》,获得了567分,这时游戏会把你的名字和567这个数字寄送给服务器。服务器收到之后,会找一个抽屉,把567放到里面,然后在抽屉上贴一个标签,并在标签上写下你的名字。由于玩游戏的人很多,服务器会不断地收到许多人寄送来的数据,带标签的抽屉也会越来越多。
  这时如果某个人点了「查看排行榜」的按钮,游戏会寄送一个「我要看排行榜」的请求给服务器,服务器收到后把当前所有抽屉的数据按分数高低排个序,再把这些数据给寄送回来,于是这个人就看到了《水果忍者》的分数排行榜。
  一个很简单的过程,对吧?我们再看个稍微复杂点的。
  《涂鸦跳跃》里有一个模式,可以让A、B两个人在线比赛,双方同时起跳,看谁先跳到一个指定的高度。在比赛过程中,每个人都得知道对方跳到哪了,所以当A的高度发生变化的时候,游戏会把这个新高度寄送给服务器,再由服务器转寄给B,B收到后就会立刻改变游戏里A角色的高度,反之亦然。于是双方都能在自己的iPhone里看到对方这时跳到哪里了。
  以上两个例子有一个共同的特点:游戏的状态是通过一台公共服务器来维护的,不同的人通过它改变游戏的状态,也通过它获取当前的游戏状态,从而共享着一个虚拟的世界。绝大部分多人游戏正是通过这种模式来实现的。
  多人游戏的本质使得它具有很强的社会性:它一方面涵盖了人和计算机的互动,另一方面孕育了人与人之间的各种关系。这种关系有很多,可能是野外打怪时的一次偶遇;可能是集市交易时的讨价还价;可能在副本任务中互相配合;也可能在竞技场里拼个你死我活或者在排行榜上争个你强我弱。
  我们完全可以把多人游戏当做是一个虚拟社会。电影《黑客帝国》的Matrix实际上就像是一款多人游戏,大部分人沉迷其中以为这就是真正的生活,而少数觉醒者发现自己是用生命在玩游戏后,壮士断网,愤然下线,来到了革命根据地锡安,在这里展开了轰轰烈烈的反矩阵运动,尴尬的是,锡安或许也只是另外一款游戏而已。
  我们还可以把微博、论坛等社区看做是一款多人游戏,用户在这里扮演着自己的角色,涨粉升级拿称号,混帮派,打团战,玩得不亦乐乎。前文曾提起过Avatar这个词,说它有神灵下凡、附体的本意,是游戏者在虚拟世界里的象征,而很多社交站点里的用户头像就叫做Avatar。
  不用等到未来,即使在眼下,虚拟社会和真实社会的关系已经是一个值得讨论的问题。
  数据是怎么保存的?
  在上一章:排行榜是怎么算出来的?里,我们把服务器想象成了一面很大的墙,墙上有很多抽屉。当你在某一局游戏里玩了567分后,游戏会把你的名字和分数一起,寄送给服务器。服务器收到之后,会打开一个空抽屉,把567这个数据放进去,并在抽屉上贴一个标签,上面写下你的名字。
  这篇文章我们继续讨论一下这个抽屉具体是怎么回事,以便尽早摆脱这个比喻。
  想象一下你走进FBI的档案室,这时候你看到了一个满是抽屉的柜子,每个柜子上贴着一个通缉犯的ID,你打开一个贴着「通缉犯_007」标签的抽屉,在里面发现了一张表格,这张表格是这位通缉犯的简历:
  这张简历里,排在左边的昵称、性别、籍贯叫做键(Key),排在右边的Jack爱放盐、男、德克萨斯州这些叫做这个键所对应的值(Value)。这张由许多键值对构成的简历叫做一个文档(Document)。每份文档都贴着一个标签(例如「通缉犯_007」),以便索引,每个柜子像是一个数据集(Collection),而整个档案室就像是一个面向文档的数据库。
  回到《水果忍者》这个例子,假设我们还要记录游戏者获得某个分数的时间,参考刚才FBI档案室的做法,服务器在收到游戏者寄送来的数据包时,需要记录如下一个文档:
  现在我们可以找一个叫做「排行榜」的柜子,把这个文档存在它的某个空抽屉里,并把这位游戏者的ID(例如「游戏者_001」)作为标签贴在抽屉的外边。除了「排行榜」这个数据集合以外,我们还需要其它的数据集,或许我们会有一个「玩家信息」的柜子,柜子的每个抽屉里都放着玩家的个人信息:
  所以,整个游戏的数据就是这么存储的:数据库里有很多个数据集,每个数据集里有很多个文档,而一个文档就是以某种格式(比如上面的键值对格式)来封装、组织数据的这么一个东西。
  当然,这种面向文档的数据库并非存储数据的唯一方式,我们还有更传统的关系型数据库,还有基于节点和边的网络型数据库等等,我们甚至可以用自己定义的格式,把数据存储在各种文件里;这些数据有可能是保存在你的iPhone上(单机游戏),也可能是保存在某台服务器上(多人游戏);但不管以何种方式存在哪里,这些数据都是对游戏世界的一种描述,是对游戏状态的一种持久化。
  透过这些数据,我们可以看到它们所描述的世界,数据越多,关于这个世界的信息就越详细。当数据多到一定程度后,我们就拥有了一个传说中的「大数据」。这些数据是如此之庞杂,以至于其中许多变量之间的相关关系是无法一眼看出来的。这个时候,我们需要把这些有价值的相关关系挖掘出来。
  等等,什么是相关关系,为什么我需要把相关关系挖出来?挖出来后能吃吗?
  先说说什么是相关关系。数学上的定义太枯燥,所以请各位再次容忍一下我的不严谨。设想你在刚才的FBI数据库里取出了很多文档,并逐个观察每个文档里一个叫做「地域」的键和另一个叫做「豆腐脑喜好」的键,假设你发现「地域」值为「北方」的文档,「豆腐脑喜好」的值都是「咸」,而「地域」为「南方」的,「豆腐脑喜好」的值都是「甜」,那么我们就说这两个变量是有相关关系的,下次再看到一个文档地域为南,我们就能猜测它的豆腐脑喜好为甜。再比如游戏角色的级别越高,杀伤力也越高;一条微博的转发量越多,被阅读次数也多;一个物体受力越大,加速度就越大,等等。
  尽管相关关系并不意味着因果关系,但它可以让你去猜测变量之间可能存在的因果关系,此外,对相关关系本身的理解也有助于我们对周围的世界获得更加准确的判断,但这一切都有个前提,就是你的数据库是没问题的。
  遗憾的是,我们常常有意无意地在自己的数据库里做着数据挖掘:知乎用户太装逼,豆瓣用户小清新,处女室友太纠结,天蝎前任复仇心。地图炮这个群攻型的拉仇恨主动技,正是以此为理论基础的。如果你把我们的世界想象成一款游戏,那么每个人所掌握的数据都只是服务器上所有数据的一部分而已,由此得出的结论,难免有失偏颇。
  声音是如何放出来的?
  音乐和声效是游戏的重要组成部分。这篇文章说说声音是如何播放的。
  在第一章:图片是怎么画到屏幕上的?里,我们把游戏设备画图的过程看做是给屏幕上每个像素格子赋值的过程。像素格子知道自己被赋予何种颜色之后,会根据这个颜色发出相应的光波,于是我们透过屏幕看到了一个五颜六色的世界。
  那么如何把声音和数值联系起来呢?
  假设游戏里有个西瓜,这个西瓜被切掉的时候需要发出「噗嗤」的叫声。
  现在我们拿起麦克风,然后对着它噗嗤一下。声源(你的喉咙)在振动的时候会不断地扰动周围的空气,空气在它的扰动下形成了一道疏密波。我想了半天也不知道怎么组织有效的语言来说清楚这事,直接看图吧:
  图里深黄色的区域空气比较稠密,浅黄色的区域空气比较稀疏,所以叫疏密波。图片里某个固定的地方,空气的疏密程度随着时间一直在变化,如果我们在这里放一个麦克风,麦克风上有个敏感的振动膜,它会被这附近的空气挤得一抖一抖,这一抖就在麦克风里产生了一个大小随着时间变化的电压,这就是「噗嗤」的模拟信号。
  接着呢,我们要把模拟信号转变为数字信号。这个转变是通过采样来完成的。
  我们可以把采样想象成这么一个过程:在麦克风里有一个电路,它的电压随时间在不断地抖动着,我们每过一会就去看一下此刻的电压是多高,并且把这个数字记录下来。那么一段时间以后,我们就会得到一系列的电压值。这一系列数值就是「噗嗤」的数字信号。假如我们手够快,一秒钟能记录44100次,那么我们就说采样率是44100赫兹。显然,采样率越高,记录下来的这组数字就越接近原始的声音。
  这一系列的数值,经过编码后,变成了一个叫做「噗嗤.mp3」的文件。到这里为止,我们已经把声音表达成数据了,就像我们把颜色表达成三个数字一样。
  如果你看过之前西瓜是怎样被切掉的?这一章节里,你就知道,在游戏者划掉西瓜的时候,游戏会立刻改变西瓜的状态,跳到下一个状态时,游戏突然发现咦西瓜爆掉了,于是它得把爆掉的场面画出来,现在则多了一个事情:播放了上面那个「噗嗤.mp3」。
  播放的过程和录音的过程相反。现在,我们只有一列数据,而原始的模拟信号已经没有了。为了还原它,我们得想个办法把两次记录之间的电压值给补上,这个过程叫做插值,对应着上文所说的采样过程。插值的方法很多,例如最简单粗暴的,在两次记录之间插入第一次的电压值。通过插值,我们把数字信号变成模拟信号——一个随着时间抖动的电压,这个抖动着的电压则会让扬声器的膜片产生振动,于是,空气在它的扰动下又产生了一道疏密波:「噗嗤」。这道疏密波传到游戏者的耳朵,引发鼓膜的振动,最后传递到他们的大脑里。
  于是,在看到西瓜爆裂的一瞬间,我们也听到了它的一声叹息。
  3D模型是怎样渲染的?
  在在第一章:图片是怎么画到屏幕上的?里,我们把图片想象成一个围棋盘,棋盘上每个格子都有自己的颜色,而颜色是可以表达成三个数字的,所以图片最终被表达成一系列的数值。在绘制图片的时候,游戏会把图片的数值告诉屏幕,屏幕根据这些数值把这张图片绘制出来。
  这章节说说3D模型是怎么表达成一系列数值的,以及怎么把这些数值告诉屏幕,从而实现3D模型的绘制。
  先以《水果忍者》里的西瓜为例说下什么是3D模型。
  假设我们到水果摊上买了一个西瓜(真正能吃的西瓜),完了拿一根针在西瓜皮上戳洞,每戳一下,相当于在西瓜表面上挑选一个点,戳了一个小时后,我们得到了成百上千的点,然后我们再耐着性子,把邻近的点用直线连起来,使它们之间形成一个个的小三角形,等把全部点连完,我们就大功告成了。这些戳出来的点叫做3D模型的顶点,它们之间的直线叫做3D模型的边,而那些三角形叫做3D模型的面。这些点、边、面一起构成了一个非常复杂的多面体,这就是西瓜的几何模型。大家看看下边这个海豚的模型就会有个直观的感受。
  显然,戳出来的点越多,多面体的面就会越多,整个模型也就越贴近真实的西瓜。如果你还记得在:声音是如何播放出来的?这个章节里所提到的数字信号的采样过程,你会发现,这个血腥残忍的西瓜戳洞过程其实就相当于对西瓜表面位置信息的一次采样,采样率越高,模型自然就越真实。
  现在,我们得记录下每个点的位置以及每个面的颜色。点的位置容易理解,面的颜色得解释一下。出于简单考虑,我们定一个规则:如果这个面的三个点都戳在了黑色瓜纹上,我们就把这个面定成黑色,否则我们把它定成绿色。记录好后,我们就得到了这个西瓜模型的数值表述:这里面不仅有几何位置,还有颜色。
  接着,我们说说怎么把3D模型画到屏幕上。我们依然可以把这个绘制的过程看做是给屏幕上的每个像素格子赋予一个颜色值的过程,只不过如今赋值的方式会稍微复杂一些。
  我们把西瓜的模型放在屏幕后方的某个地方,然后在屏幕前方选一个点,这个点叫做焦点(下图中蓝色的点)。我们知道两点可以决定一条直线,因此屏幕上的每个像素格子都可以和这个焦点一起,决定一条直线,如果这条直线和西瓜模型的某个面相交了,我们就把这个面的颜色(绿色或黑色)赋值给这个像素格子;如果这条直线没有和西瓜模型相交,我们就把背景的颜色(比如灰色)赋值给这个像素。这样,等所有像素格子都扫过一遍,我们就画出一个灰色背景下的西瓜了。
  在《水果忍者》里,一个西瓜飞上来的时候,它除了飞行以外,还在翻滚。每一帧,游戏都得根据它的物理规则,计算出模型上的每个顶点的位置,然后按照上面所说的方法把模型渲染出来。由于每一帧都需要重新渲染,所以我们说这个3D模型是通过即时渲染的方式绘制出来的。
  最后得特别说明一下,本章节并不是在叙述具体的建模过程,实际上从原画、建模到贴图、动作是一个十分繁复的流程;而渲染时除了位置和颜色外,还涉及到材质、光源等许多因素。跟本系列的其它章节一样,本文还是希望以易读为目的,不周全之处大家见谅。
  再谈游戏状态的改变
  游戏的世界里一切都是数字。每时每刻,这些数字都在不断变化着,演绎出精彩纷呈的游戏状态。
  所谓一花一世界,一叶一菩提,每一款游戏也都有自己独特的状态演变规则,这篇文章我们以某些特定类型的游戏为例子,看看它们的状态到底是如何变化的。
  《水果忍者》这款游戏在每一帧开始的时候,得计算西瓜在此帧的位置变化、速度变化、翻滚转角的变化;在接收用户事件的时候,得计算西瓜是否爆掉。游戏状态的变化可能是因为每一帧的计算,也可能是因为游戏者的输入。
  Popcap公司家喻户晓的作品《宝石迷阵》是匹配游戏的开山之作。匹配游戏的规则往简单了说,就是满足一定匹配条件的宝石会从棋盘上消失掉,而新的宝石以某种方式来填补棋盘的空缺。匹配条件通常是跟宝石的颜色和位置直接相关的:把相同颜色的宝石排成某种特定的形状即可以满足匹配,例如《宝石迷阵》里三个红色的宝石排成一排就能满足匹配条件,然后果断消失,由此空出来的位置则由上方掉落下来的宝石填充。游戏检测到用户事件(一次拨动)时,由于拨动会改变宝石的位置,它就必须立刻开始检测被拨动的两颗宝石在新的位置上是否满足匹配条件,一旦发现满足匹配条件的宝石,它得将它们的状态改成「已匹配」,然后在未来的一段时间里,让它们消...
  来自乌拉圭的独立游戏工作室Ironhide你可能没怎么听说,但它们的作品《Kingdom Rush》却是一款可玩性极佳、知名度也很高的塔防游戏。在此类游戏里,通常你得在一个棋盘上放置塔,这些塔会攻击道路上的敌人,以便阻止它们到达某个目的地。游戏的状态是由许多参数来描述的,例如塔的位置、级别,炮弹的位置、杀伤力,敌人的位置、血量等等。每一帧,游戏都要计算的东西不少,例如炮塔此帧是否可以发射炮弹;飞行中的炮弹位置如何变化是否撞到敌人;那些跑得正欢的敌人位置得不断改变,而那些不幸中弹的敌人血量也得扣除。在接收到用户事件时,它通常还得改变塔的状态,例如提升塔的级别,或者干脆把塔拆掉,换成一堆金币。
  我们再来看看在iPhone上曾一度如日中天的《愤怒的小鸟》,这是一款「牛顿力学游戏」。这类游戏的规则通常是基于经典物理学,每一帧除了计算鸟的飞行路径以外,它们还有一件很重要的任务,那就是做碰撞检测。什么是碰撞检测呢?假设游戏里有两个球,我们每帧都去计算它们的半径之和以及它们圆心之间的距离,一旦发现它们的半径之和小于圆心间的距离,那么我们就说它们碰撞了,并根据它们的质量、弹性系数等参数来改变它们的速度。当然,小鸟和建筑物之间的碰撞要比这个难算得多。在此类游戏里,负责这部分复杂计算的代码模块就是物理引擎。另外,在《愤怒的小鸟》里,当游戏者的手在屏幕上滑动时,游戏会根据手指的位置,来改变小鸟的位置,...
  现在我们再来看《涂鸦跳跃》就会显得相对简单了:当你倾斜iPhone的时候,游戏会根据你所摇的方向改变主角的位置,而每一帧游戏改变着主角的位置,让它蹦个没完。如果这时候你恰好在和其它人比赛,那么对方摇动iPhone时,这个信息会通过服务器递送给你,改变你的iPhone中相应角色的位置。
  ok,游戏种类很多,这么说下去是说不完的,好在本文只是希望以举例的方式对前面的几个章节做个补充说明,目的还是在阐述游戏状态的改变这事:游戏状态的变化规则因游戏而异,引起状态变化的可能是用户事件,可能是每帧的计算,也可能是来自服务器的信息。
  人为什么要玩游戏?
  陈奕迅有一首歌叫《沙龙》,黄伟文写的词,词里有一句:「音乐、话剧、诗词和舞蹈,糅合生命千样好」。
  陈奕迅还有一首歌叫《单车》,也是黄伟文写的词,词里有一句:「茫茫人生,好像荒野」。
  让我们从这两句歌词出发,来探讨一下题目里的问题。
  维百里有个词条叫「The arts」,用以指代「广义的艺术」。广义的艺术,顾名思义,涵盖着各种各样的艺术形式:诗歌、小说、音乐、舞蹈、相声、段子、话剧、电影、绘画、雕塑以及游戏。
  这些看起来分属于天南地北的创作形式,彼此之间究竟有什么共同点,以至于我们会将其归类到同一个范畴里去?
  答案或许在于,它们都是创作者向受众传达信息的方式。一段故事、一种情绪、一个观点,这些信息在你面前刻画出一个世界,让你浮想联翩,如在梦中。
  生活是有局限性的,没有绝对的自由。惊喜的邂逅,走心的共鸣,可遇不可求;自我的认可,他人的肯定,易沦于鸡汤应酬;笑口常开泪点低也是说起来容易做起来难;甚至就连狂欢有时也会褪变成一群人的孤单??说「茫茫人生,好像荒野」或许有点夸张,但在某些特定的时候,源于生活的艺术的确比生活本身更理想一些。「糅合生命千样好」,大概就是这个意思。
  艺术作品的这个共性——作为生活的理想和美化——在游戏这种形式里面,得到很好的体现。
  《Don't Starve》(《饥荒》),是一款模拟野外生存的冒险游戏。你穿越到一个神秘小岛后,发现四周荒无人烟,只有一些稀稀拉拉的灌木丛和几片浓密不均的小林子,你意识到自己一时无法逃离此地,所要考虑的是如何在这里生存下去。你开始采集食物,引火,制作工具,为了获取更多资源,你甚至还得和当地的猪民部落交易。
  这款游戏的有趣之处在于它很好地阐释了一种叫做Emergent Gameplay的设计思想。当你开始一次新的冒险时,游戏会通过某种算法为你创造出独一无二的世界,这个世界的地图布局、食物分布跟之前的任何一次冒险都不同。随着时间的流逝,事情的发展方向也会有无穷多个,未来几乎是不可预测的。整个世界在有限的规则集下涌现出无限的可能性。这种丰富性通过特定的美术风格展现出来,把你带到一个新奇的世界里。这是任何一个人在现实生活里都无法随便经历的。
  跟玩绝大部分游戏时一样,人们会在《Don't Starve》里追求某种成就:你看,我挺过冬季生存了一个多月,还给自己盖了一个安全的营地呢。心理学里有一个叫做「Flow」的概念,翻译过来大概叫做「沉浸」比较合适。面对一个任务或挑战的时候,人们对所需技能的掌握程度和挑战本身的难易程度,共同决定了这个人的心理状态。一个尚未熟练掌握相关技巧的人面对高难度的挑战时会出现挫败感;相反,一个已经熟练掌握相关技巧的人面对低难度的挑战时会觉得无聊;而当两者平衡在一个特定的区域内时,人们会沉浸其中,忘我游戏,这个特定区域下人们的状态就叫做「Flow」。它有足够的潜力让人们尽可能地停留在这个舒适的区域,而生活里的挑战相对来说就要残酷许多。
  理想化生活还有很多种方式,新奇的世界,适中的挑战只是其中两种。游戏设计师拉夫·科斯特在《快乐之道》中说了这么一个观点:游戏可以让人们学习到许多技能,而在学习的过程中,人们能感受到快乐。尽管我并不认为这是游戏最重要的意义,但这的确是人们玩游戏的一个原因。在我的理解里,这也是游戏将生活理想化的方式之一。
  所以人们为什么要玩游戏?因为游戏和其它所有的艺术形式一样,把生活理想化、自由化成一个独特的境界,然后将你带入其中,换句话说,因为它们让你体验到生活里很难体验到的东西。
  游戏跟其它艺术形式相比,历史相对短暂。诗歌音乐文学不说了,就算是电影也已经有百来年的历史,而游戏只有短短的半个多世纪。正因为它新,它有很多不足,但也正因为它新,它有很大潜力。在刻画一个虚拟世界方面,它有着得天独厚的优势,而随着游戏行业的演化,它在理想化生活这方面还会越来越有力。与其把游戏看做对生活的逃避或侵犯,不如把它看做对生活的美化和拓展。
  最后引用一下爱因斯坦:「All religions, arts and sciences are branches of the same tree. All these aspirations are directed toward ennobling man's life, lifting it from the sphere of mere physical existence and leading the individual towards freedom.」
一站关注,多维度进入移动游戏圈
上方网: sfw-2012
上道: shangdaowx
小伙伴招聘:xhbzhaopin
爱链客: izhike2012
你可能感兴趣的资料
  日,由中国电子商务协会网络直播委员会主办的中国网络直播行业发展高
  暴雨过后,清新的空气与略显清冷的风压住了整个夏季的聒噪。天空放晴之后,LanSt
  6月7日消息,如今移动游戏已经成为了人们生活的必须,其市场规模越来越庞大。而为了
  6月7日消息,日前苹果公司举行了WWDC大会,公布了一系列有关系统和软件方面的革
  6月7日消息,此前Steam母公司Valve对游戏采取了新的审核标准,重点打击带
2345678910
2345678910
(C) 上方网 京ICP证:041414号 电子公告许可 北京市公安局海淀分局备案编号:}

我要回帖

更多关于 工序 英文 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信