如何理解游戲:游戲與動畫的不同及游戲內事件的實現

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

  文/ 林博昱  授權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條軍規
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表