遊戲程式設計入門指南

遊資網發表於2020-01-21
遊戲程式設計入門指南


引言

遊戲程式碼也寫了幾年, 有時候在想如果現在給剛入行的自己一點建議也許能有一點幫助。

所以這篇日誌主要是分享一下自己對於遊戲程式設計入門的一些想法。

這篇文章由愛發電支援寫作, 如果你喜歡我做的事情,可以考慮在那裡支援我。

語言的選擇

在一開始更多是推薦從高階語言入門,比如 Java、C#、lua、python,javascript。在這個時期可以配合一些遊戲引擎來學習,如果你是因為喜歡遊戲才學習程式設計的可能不喜歡老是 print 一些文字,可能更喜歡輸出圖片。

可以直接從對應語言的遊戲引擎開始做幾個小 Demo 瞭解一下游戲構造,但是遊戲引擎有個弊端就是 API 太多入門有點難……

遊戲引擎的優點是做遊戲會比較快,但是引擎整體還是略龐大,不適合學習程式碼之用。

之後可以使用 pico-8、love2d、pygame、SDL 或者直接 javascript 操作 canvas 畫布來製作嘗試製作遊戲挑戰自己程式設計能力。

而 C 語言(包含 C++)可以放在後續研究,研究 C 語言可以對語言底層點的東西理解。像指標可以讓你直接訪問記憶體,這在其他語言中是很少見。可能一般感受不出來它的力量,但當你面對資源緊張的系統(需要手動記憶體管理),比如 GBA 和 NDS 上面的程式設計時候就繞不開 C 語言甚至組合語言了。

一定要多動手

我在沒學習程式設計之前是個愛看書的小青年。所以在我剛開始學習寫程式碼時候常常就一直看書沒有實踐,有些東西看似懂了,實際還是要上手操作才能掌握透徹。

在著手寫程式碼時候最好是帶著問題去學習,程式設計其實就是把複雜問題分解。比如在製作一個小 Demo 時候可以考慮這幾個問題:

  • 如何顯示一個圖片/精靈
  • 如何播放幀動畫
  • 如何控制兩個物體碰撞
  • 兩個物體碰撞時候銷燬其中一個同時生成一個物體播放幀動畫特效然後播放完成之後銷燬
  • 如何播放音樂音效
  • 背景層滾動效果怎麼做
  • 如何處理存檔(資料持久化)


而之後可以考慮的問題可能有:

  • 精靈的顯示如何分清楚哪個先渲染哪個後渲染(渲染層次)
  • 每次播放特效都生成一個物體然後銷燬是不是有點浪費記憶體,可不可以一次生成多個重複利用(引入了物件池)
  • 存檔時候如果 A 寫入存檔還沒結束時候 B 又寫入存檔會不會出問題(引入了檔案系統使用單例)


不要執著於 Opengl

遊戲行業比較流行圖形學,可能感覺起來高達上,但是對於初學者(非初學者其實也一樣)來說更多還是應該專注於 GamePlay。

我在剛開始寫程式碼沒多久就跑去拿本 opengl 紅寶書在啃,寫了一堆程式碼到頭來也沒學到什麼。

一開始不要考慮3D 方面東西,從簡單的2d 開始比較不錯。這個時候我更多推薦看下程式碼本色和遊戲人工智慧來鍛鍊一下程式碼能力。

甚至如果要學圖形學 Shader 的,我更多建議是先直接用 Unity 上面先學習如何寫一些 Shader(推薦Unity 著色器和螢幕特效開發祕笈),能寫一些比較特效之後然後再回頭去寫那些渲染管線 Opengl 那些會比較有感觸。

不要禁錮在遊戲引擎中

現在遊戲引擎非常方便,寫軟體的目的就是為了使其越來越容易使用。

但一直使用遊戲引擎對於初學程式設計的人來說會比較難以提高程式設計水平。個人建議是可以從先從遊戲引擎入門,然後嘗試不使用引擎使用上面提到一些底層點的框架或者工具來製作遊戲。

造點小輪子有助於提高

很多人都說不要重複造輪子,但有時候別人的輪子比較重量級不夠輕。自己寫點適合自己的輕量級的輪子也對自己程式設計能力有一定提高,也可以更多享受程式設計的樂趣。

比如用上文提到的比較底層的框架(比如 SDL)來製作遊戲然後自己寫個簡單的地圖編輯器、粒子系統、存檔檔案儲存讀取系統或者選單系統。雖然你做的這個跟專業引擎製作的沒法比,但有一天你回到引擎裡再來看待一些問題會有不一樣的解決思路。

注意資料結構的應用

資料結構剛學習時候會陷入這東西在遊戲開發中能幹什麼的疑惑之中。除了比較常見尋路用到圖和網路程式設計的訊息佇列,其他的在我一開始學習資料結構時候都一無所知。

堆疊的應用:在處理選單時候比如進入設定選單時候把新選單壓棧操作,返回時候出棧銷燬即可。在遊戲場景進入到一個房間時候可以把當前遊戲場景暫停然後把新的房間場景壓棧。

佇列的應用:在一些需要緩衝輸入時候(比如格鬥遊戲)可以使用佇列來控制輸入操作。在一些技能系統比如一回合有8個體力槽玩家來組合攻擊。在製作回放系統時候也可以使用佇列來製作。

樹的應用:基本是當你需要面對分支而且每個分支都有分支時候需要考慮。典型的比如劇情或者對話樹,在節點下有很多子物體,子物體又可以有很多子物體時候也是它的應用場景。

圖的應用:在視覺化流程控制,有限狀態機和導航系統都可以找到它的影子。

遊戲開發設計模式應用

這個其實有專門書籍進行闡述, 我也只是班門弄斧而已 ,我只談論幾個對於我初學時候比較有收穫的。

單例模式:在很多人剛開始接觸遊戲引擎時候都會面臨一個問題是場景切換不銷燬資料,不推薦的做法也是一些初學者會犯的是把資料儲存到本地,然後下個場景再讀取。這種直接進行讀寫操作是不可取而且當你要儲存的是一個遊戲物件(GameObject)時候就沒辦法了(當然其實也可以序列化物件儲存到本地但仍然不可取)。這個時候比較可取的就是儲存到一個全域性的靜態物件/變數上,這就引入了單例模式。還有比如一些系統只能有一個入口不允許隨便使用不然會出錯,比如典型的檔案 IO 和控制器輸入控制。

資料驅動:在 Unity 的 ScriptObject 中明顯就是資料驅動,其核心思想就是改動資料而不必改動程式碼。而當你要使用資料驅動時候一定要分清楚什麼可以硬編碼什麼可以資料驅動,配置太多的話是很影響開發效率和可閱讀性。

降低指標跳轉消耗:我覺得這個也是 ECS 提出的原因之一,在大型遊戲中面對的是巨量的遊戲物體,這個時候遊戲物體中又有各種指標跳轉的話造成的效能消耗就不能忽視了。所以在寫程式碼時候要注意降低指標跳轉,儘量讓記憶體連續分佈,比如使用結構體和陣列。當然記憶體連續分佈也可以減少記憶體碎片。

原型模式:這個一開始好像是在 Cocos2d-x 裡面看到過,一個介面來實現克隆當前物件。在實際遊戲中其實也挺常見,比如 GBA 的木葉戰記中,鳴人使用影分身可以生成一個新的人物但是攻擊力和血量減半。在 Unity 中 Prefab 從 Project 視窗拖動到 Scene 中時候也是使用類似思路(應該吧)。

注意程式碼整潔

這個更多是經驗性的東西,我也難說做得很好。保持程式碼可讀性是為了日後你或者別人回來看程式碼能看得懂。保持函式的單一職責很有必要,當你發現有些程式碼重複寫了幾次就應該思考這是否應該放到一個函式中。你必須明白的是 Bug 總是會有的,總有一天你或者別人會重新看這些程式碼,如果在寫的時候稍加註意,後期的維護和複用就會相對簡單輕鬆。

具體可以看下程式碼大全、程式碼整潔之道和這個視訊。

最後,製作遊戲很有趣,寫遊戲程式碼也很開心,希望你也能享受遊戲程式設計的快樂!

推薦書籍

遊戲設計、原型與開發
Data Structures for Game Programmers
遊戲程式設計模式
程式碼大全
程式碼整潔之道
遊戲人工智慧程式設計案例精粹
程式碼本色:用程式設計模擬自然系統
Game Coding Complete
Game Programming Algorithms and Techniques
Shaders for Game Programmers and Artists
Unity 著色器和螢幕特效開發祕笈


作者:Codinggamer
來源:indienova

原地址:https://indienova.com/indie-game-development/game-programming-for-beginners/

相關文章