你的遊戲開發第0課
電子遊戲是許多人喜愛甚至沉迷的事情。尤其對於程式員來說,開發遊戲是不少人最初學習程式設計的動力。在之前,我發過一些遊戲開發的教程和案例:
- ofollow,noindex" target="_blank">爆款遊戲《貪吃蛇大作戰》的 Python 實現
- 如何用100行Python程式碼做出魔性聲控遊戲“八分音符醬”
- 熬夜寫了一個小遊戲,向SpaceX聊表敬意
- 王校長一分鐘能吃多少熱狗?| 小遊戲
- 《pygame入門教程》(公眾號 Crossin的程式設計教室 回覆關鍵字 pygame )
遊戲開發也是學習程式設計的一個很好方式 ,程式碼上的各種增加和改動會立刻有直觀的反饋,讓你的學習過程顯得不那麼枯燥。
不過遊戲開發和一般程式設計初學時接觸的程式開發模式有一定的區別,剛上手可能很不適應。我發現網上的遊戲開發教程大多是從某種語言或引擎的開發細節入手,而沒有一個提綱挈領式的整體介紹。作為一個有不少年遊戲開發經驗的開發者,我今天就分享下這方面的經驗。
電子遊戲的原理
電子遊戲的原理其實和電影的原理是一樣的,都是利用人的“ 視覺暫留 ”和“ 似動現象 ”,使原本離散的靜止影象,看起來是連續的動態效果。

這種翻頁動畫就是最好的例子。只不過電影通過膠片和放映機把它自動化了,而電子遊戲更進一步:不但可以自動連續播放,而且過程中你可以去控制畫面中的內容。這有賴於計算機程式的實現,但本質是相通的。
我們平常玩的遊戲,其實都是一張張影象連續播放而成。播放的快慢,就是我們經常聽到的 “幀率”(FPS) 。當你的電腦配置跟不上游戲的要求,執行幀數很低時,會被戲稱為“幻燈片”,也正是由於這個原因。
基於此,遊戲程式的程式碼在結構上就和一般的程式就有了明顯的區別,就是:
主迴圈
對於遊戲來說,需要有一個不停執行的迴圈,不停產生影象,並把它顯示到螢幕上。在我們 pygame 的教程中,你可以很明顯地看到這個:
while True: ...
在主迴圈裡進行的各種讀寫、計算、處理、渲染……構成了遊戲的每一幀。有一類遊戲開發崗位常見的面試題,我面試 Ubisoft 的時候被問到過,後來也用來問過很多應聘者:
以一個 FPS 遊戲為例,列舉遊戲在一幀內需要處理哪些事情?
給出一份我的參考答案:
- 事件響應 ,主要是使用者的輸入。如鍵盤按鍵、滑鼠移動、滑鼠點選、語音等。
- 更新遊戲內元素的 運動狀態 ,這一環節大多由物理引擎處理。如移動、下落、慣性等。
- 碰撞檢測 ,以及碰撞後的事件響應。如子彈擊中角色、拾取物品等。
- 電腦角色(NPC)的行為,即 電腦 AI 。
- 網路請求、資料更新、同步 等,判定遊戲得分及勝負。
- 計算或播放 動畫 效果。如人物動作、爆炸特效、樹木水面等環境效果。
- 渲染場景 畫面,包括光照效果等,即生成最終顯示的畫面。
這一些列動作需要用到大量 CPU 和 GPU(顯示卡) 的計算。計算的快慢決定了遊戲一幀的耗時。通常最耗時的操作在於 實時的動畫計算和光照渲染 。這就是為什麼當你玩遊戲卡頓時,可以通過調低畫面效果、關閉軟陰影/抗鋸齒、降低模型質量等方法改善,或者,買一塊更強大的顯示卡……
遊戲程式的主體結構抽象來說就是這樣一個流程:

這裡提一個小細節,就是如果我們計算運動是按照每一幀更新固定的長度來計算,就會出現運算速度快的電腦上幀數很高,運動就很快,反之差的電腦上就很慢(我們 pygame 教程裡的打飛機遊戲就是如此)。通常的解決方法,一種是 固定幀數 ,大家都是30幀執行;還有一種就是對運動速度進行修正,最簡單的辦法就是 以固定值乘以上一幀實際消耗的時間 。
遊戲中的設計模式
談了遊戲程式的整體結構,我再來說幾個遊戲開發中常用設計理念和模式。
首先是 面向物件 。因為遊戲大多是對現實場景的模擬和抽象,含有眾多角色和道具,所以它比其他程式更適合使用面向物件的設計。不少企業在面試時也會用遊戲角色的設計來考察面向物件的概念。比如:一個兵種就是一個類,它有父類(角色),有子類(細分兵種),有屬性(血量、攻擊),有方法(攻擊、死亡)。
MVC模式(Model-View-Controller) ,即把 模型、檢視、控制器 分離開的設計。在遊戲開發中,通過 MVC 模式,將遊戲玩家、場景及角色的資料(Model)、遊戲畫面和選單的顯示(View)、遊戲的輸入控制和邏輯處理(Controller)分離開,會讓程式的架構更合理,容易維護和擴充套件。
狀態機 。遊戲中的角色,經常會有多種狀態的切換,比如第一人稱射擊遊戲中的站立、跑動、開鏡、下蹲、臥倒等。如果簡單的通過一堆 if-else 來管理各種狀態的切換,會讓程式碼十分繁瑣很難以維護。這時候可以瞭解下狀態機模式。
遊戲開發之路
在實際的開發中,幾乎沒有團隊是從零開始寫一個遊戲,或多或少都會使用或自研 遊戲引擎 。所謂遊戲引擎,就是把我們前面說到的一些遊戲中的通用工作,比如輸入處理、物理引擎、動畫、場景渲染、網路互動等部分封裝起來,讓開發者可以專注於遊戲本身玩法的開發。像之前提過的 Cocos、Unity,包括 pygame 都屬於遊戲引擎的範疇,只不過各自的形式和側重點有所不同。
在引擎之上,遊戲開發團隊還會為遊戲製作專門的 編輯器 ,以方便遊戲策劃人員編輯關卡和數值。如果你搗鼓過暴雪的魔獸爭霸、星際爭霸之類的編輯器,對此一定深有感觸。
一個最簡單的遊戲團隊,一般也有三類人: 策劃、程式、美術 。這是遊戲開發不可或缺的三個部分。策劃負責遊戲的玩法、數值、關卡、劇情等設計,程式負責實現功能以及開發相關工具,美術負責各種視覺素材。再多一點可能還會有專門的動畫和音效人員;也有個人獨立開發者所有工作一肩挑。而如今的大製作遊戲,團隊則要龐大許多,各種細化分工就遠不止這些了。
如果你有志於從事遊戲行業,或者想開發出屬於自己的遊戲,我給出一點建議:
- 瞭解 遊戲開發 的基礎,一般遊戲引擎都有官方教程,跟著做
- 打牢 程式設計基礎 ,包括資料結構、演算法、設計模式等
- 多瞭解各方面的知識,多點 興趣愛好 ,不僅僅是玩遊戲。這對於寫程式碼或許沒有直接幫助,但如果你想做自己的遊戲,這些將會派上用場
- 多寫 。不要糾結太多,就從最弱最簡單的小遊戲開始寫,一個接一個的寫。堅持下去,並不會太久,量變就會產生質變。
以上是我關於遊戲開發的經驗與分享。你若有其他想了解的,歡迎留言討論。
════
其他文章及回答:
程式設計實訓 |如何自學Python |新手引導 |精選Python 問答 |Python單詞表 |人工智慧 |爬蟲 |我用Python |requests |計算機視覺
歡迎搜尋及關注: Crossin的程式設計教室