电竞比分网-中国电竞赛事及体育赛事平台

0731-85137865

010-68207668

產(chǎn)業(yè)雜談 / STANDARD
聯(lián)系我們


地址:長(zhǎng)沙市天心區(qū)雀園路568號(hào)創(chuàng)谷主樓2樓天心文化(廣告)產(chǎn)業(yè)園

電話:0731-85137865

郵箱:gongxin@www.wzwhfm.com


產(chǎn)業(yè)雜談 您現(xiàn)在的位置: 首頁(yè)電競(jìng)產(chǎn)業(yè) 產(chǎn)業(yè)雜談→ 游戲編程入門指南

游戲編程入門指南

日期:2020-02-10 作者:新浪游戲


引言

游戲代碼也寫(xiě)了幾年, 有時(shí)候在想如果現(xiàn)在給剛?cè)胄械淖约阂稽c(diǎn)建議也許能有一點(diǎn)幫助。

所以這篇日志主要是分享一下自己對(duì)于游戲編程入門的一些想法。

這篇文章由愛(ài)發(fā)電支持寫(xiě)作, 如果你喜歡我做的事情,可以考慮在那里支持我。

語(yǔ)言的選擇

在一開(kāi)始更多是推薦從高級(jí)語(yǔ)言入門,比如 Java、C#、lua、python,javascript。在這個(gè)時(shí)期可以配合一些游戲引擎來(lái)學(xué)習(xí),如果你是因?yàn)橄矚g游戲才學(xué)習(xí)編程的可能不喜歡老是 print 一些文字,可能更喜歡輸出圖片。

可以直接從對(duì)應(yīng)語(yǔ)言的游戲引擎開(kāi)始做幾個(gè)小 Demo 了解一下游戲構(gòu)造,但是游戲引擎有個(gè)弊端就是 API 太多入門有點(diǎn)難……

游戲引擎的優(yōu)點(diǎn)是做游戲會(huì)比較快,但是引擎整體還是略龐大,不適合學(xué)習(xí)代碼之用。

之后可以使用 pico-8、love2d、pygame、SDL 或者直接 javascript 操作 canvas 畫(huà)布來(lái)制作嘗試制作游戲挑戰(zhàn)自己編程能力。

而 C 語(yǔ)言(包含 C++)可以放在后續(xù)研究,研究 C 語(yǔ)言可以對(duì)語(yǔ)言底層點(diǎn)的東西理解。像指針可以讓你直接訪問(wèn)內(nèi)存,這在其他語(yǔ)言中是很少見(jiàn)??赡芤话愀惺懿怀鰜?lái)它的力量,但當(dāng)你面對(duì)資源緊張的系統(tǒng)(需要手動(dòng)內(nèi)存管理),比如 GBA 和 NDS 上面的編程時(shí)候就繞不開(kāi) C 語(yǔ)言甚至匯編語(yǔ)言了。

一定要多動(dòng)手

我在沒(méi)學(xué)習(xí)編程之前是個(gè)愛(ài)看書(shū)的小青年。所以在我剛開(kāi)始學(xué)習(xí)寫(xiě)代碼時(shí)候常常就一直看書(shū)沒(méi)有實(shí)踐,有些東西看似懂了,實(shí)際還是要上手操作才能掌握透徹。

在著手寫(xiě)代碼時(shí)候最好是帶著問(wèn)題去學(xué)習(xí),編程其實(shí)就是把復(fù)雜問(wèn)題分解。比如在制作一個(gè)小 Demo 時(shí)候可以考慮這幾個(gè)問(wèn)題:

如何顯示一個(gè)圖片/精靈

如何播放幀動(dòng)畫(huà)

如何控制兩個(gè)物體碰撞

兩個(gè)物體碰撞時(shí)候銷毀其中一個(gè)同時(shí)生成一個(gè)物體播放幀動(dòng)畫(huà)特效然后播放完成之后銷毀

如何播放音樂(lè)音效

背景層滾動(dòng)效果怎么做

如何處理存檔(數(shù)據(jù)持久化)

而之后可以考慮的問(wèn)題可能有:

精靈的顯示如何分清楚哪個(gè)先渲染哪個(gè)后渲染(渲染層次)

每次播放特效都生成一個(gè)物體然后銷毀是不是有點(diǎn)浪費(fèi)內(nèi)存,可不可以一次生成多個(gè)重復(fù)利用(引入了對(duì)象池)

存檔時(shí)候如果 A 寫(xiě)入存檔還沒(méi)結(jié)束時(shí)候 B 又寫(xiě)入存檔會(huì)不會(huì)出問(wèn)題(引入了文件系統(tǒng)使用單例)

不要執(zhí)著于 Opengl

游戲行業(yè)比較流行圖形學(xué),可能感覺(jué)起來(lái)高達(dá)上,但是對(duì)于初學(xué)者(非初學(xué)者其實(shí)也一樣)來(lái)說(shuō)更多還是應(yīng)該專注于 GamePlay。

我在剛開(kāi)始寫(xiě)代碼沒(méi)多久就跑去拿本 opengl 紅寶書(shū)在啃,寫(xiě)了一堆代碼到頭來(lái)也沒(méi)學(xué)到什么。

一開(kāi)始不要考慮3D 方面東西,從簡(jiǎn)單的2d 開(kāi)始比較不錯(cuò)。這個(gè)時(shí)候我更多推薦看下代碼本色和游戲人工智能來(lái)鍛煉一下代碼能力。

甚至如果要學(xué)圖形學(xué) Shader 的,我更多建議是先直接用 Unity 上面先學(xué)習(xí)如何寫(xiě)一些 Shader(推薦Unity 著色器和屏幕特效開(kāi)發(fā)秘笈),能寫(xiě)一些比較特效之后然后再回頭去寫(xiě)那些渲染管線 Opengl 那些會(huì)比較有感觸。

不要禁錮在游戲引擎中

現(xiàn)在游戲引擎非常方便,寫(xiě)軟件的目的就是為了使其越來(lái)越容易使用。

但一直使用游戲引擎對(duì)于初學(xué)編程的人來(lái)說(shuō)會(huì)比較難以提高編程水平。個(gè)人建議是可以從先從游戲引擎入門,然后嘗試不使用引擎使用上面提到一些底層點(diǎn)的框架或者工具來(lái)制作游戲。

造點(diǎn)小輪子有助于提高

很多人都說(shuō)不要重復(fù)造輪子,但有時(shí)候別人的輪子比較重量級(jí)不夠輕。自己寫(xiě)點(diǎn)適合自己的輕量級(jí)的輪子也對(duì)自己編程能力有一定提高,也可以更多享受編程的樂(lè)趣。

比如用上文提到的比較底層的框架(比如 SDL)來(lái)制作游戲然后自己寫(xiě)個(gè)簡(jiǎn)單的地圖編輯器、粒子系統(tǒng)、存檔文件保存讀取系統(tǒng)或者菜單系統(tǒng)。雖然你做的這個(gè)跟專業(yè)引擎制作的沒(méi)法比,但有一天你回到引擎里再來(lái)看待一些問(wèn)題會(huì)有不一樣的解決思路。

注意數(shù)據(jù)結(jié)構(gòu)的應(yīng)用

數(shù)據(jù)結(jié)構(gòu)剛學(xué)習(xí)時(shí)候會(huì)陷入這東西在游戲開(kāi)發(fā)中能干什么的疑惑之中。除了比較常見(jiàn)尋路用到圖和網(wǎng)絡(luò)編程的消息隊(duì)列,其他的在我一開(kāi)始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí)候都一無(wú)所知。

堆棧的應(yīng)用:在處理菜單時(shí)候比如進(jìn)入設(shè)置菜單時(shí)候把新菜單壓棧操作,返回時(shí)候出棧銷毀即可。在游戲場(chǎng)景進(jìn)入到一個(gè)房間時(shí)候可以把當(dāng)前游戲場(chǎng)景暫停然后把新的房間場(chǎng)景壓棧。

隊(duì)列的應(yīng)用:在一些需要緩沖輸入時(shí)候(比如格斗游戲)可以使用隊(duì)列來(lái)控制輸入操作。在一些技能系統(tǒng)比如一回合有8個(gè)體力槽玩家來(lái)組合攻擊。在制作回放系統(tǒng)時(shí)候也可以使用隊(duì)列來(lái)制作。

樹(shù)的應(yīng)用:基本是當(dāng)你需要面對(duì)分支而且每個(gè)分支都有分支時(shí)候需要考慮。典型的比如劇情或者對(duì)話樹(shù),在節(jié)點(diǎn)下有很多子物體,子物體又可以有很多子物體時(shí)候也是它的應(yīng)用場(chǎng)景。

圖的應(yīng)用:在可視化流程控制,有限狀態(tài)機(jī)和導(dǎo)航系統(tǒng)都可以找到它的影子。

游戲開(kāi)發(fā)設(shè)計(jì)模式應(yīng)用

這個(gè)其實(shí)有專門書(shū)籍進(jìn)行闡述, 我也只是班門弄斧而已 ,我只談?wù)搸讉€(gè)對(duì)于我初學(xué)時(shí)候比較有收獲的。

單例模式:在很多人剛開(kāi)始接觸游戲引擎時(shí)候都會(huì)面臨一個(gè)問(wèn)題是場(chǎng)景切換不銷毀數(shù)據(jù),不推薦的做法也是一些初學(xué)者會(huì)犯的是把數(shù)據(jù)保存到本地,然后下個(gè)場(chǎng)景再讀取。這種直接進(jìn)行讀寫(xiě)操作是不可取而且當(dāng)你要保存的是一個(gè)游戲?qū)ο螅℅ameObject)時(shí)候就沒(méi)辦法了(當(dāng)然其實(shí)也可以序列化對(duì)象保存到本地但仍然不可?。_@個(gè)時(shí)候比較可取的就是保存到一個(gè)全局的靜態(tài)對(duì)象/變量上,這就引入了單例模式。還有比如一些系統(tǒng)只能有一個(gè)入口不允許隨便使用不然會(huì)出錯(cuò),比如典型的文件 IO 和控制器輸入控制。

數(shù)據(jù)驅(qū)動(dòng):在 Unity 的 ScriptObject 中明顯就是數(shù)據(jù)驅(qū)動(dòng),其核心思想就是改動(dòng)數(shù)據(jù)而不必改動(dòng)代碼。而當(dāng)你要使用數(shù)據(jù)驅(qū)動(dòng)時(shí)候一定要分清楚什么可以硬編碼什么可以數(shù)據(jù)驅(qū)動(dòng),配置太多的話是很影響開(kāi)發(fā)效率和可閱讀性。

降低指針跳轉(zhuǎn)消耗:我覺(jué)得這個(gè)也是 ECS 提出的原因之一,在大型游戲中面對(duì)的是巨量的游戲物體,這個(gè)時(shí)候游戲物體中又有各種指針跳轉(zhuǎn)的話造成的性能消耗就不能忽視了。所以在寫(xiě)代碼時(shí)候要注意降低指針跳轉(zhuǎn),盡量讓內(nèi)存連續(xù)分布,比如使用結(jié)構(gòu)體和數(shù)組。當(dāng)然內(nèi)存連續(xù)分布也可以減少內(nèi)存碎片。

原型模式:這個(gè)一開(kāi)始好像是在 Cocos2d-x 里面看到過(guò),一個(gè)接口來(lái)實(shí)現(xiàn)克隆當(dāng)前對(duì)象。在實(shí)際游戲中其實(shí)也挺常見(jiàn),比如 GBA 的木葉戰(zhàn)記中,鳴人使用影分身可以生成一個(gè)新的人物但是攻擊力和血量減半。在 Unity 中 Prefab 從 Project 窗口拖動(dòng)到 Scene 中時(shí)候也是使用類似思路(應(yīng)該吧)。

注意代碼整潔

這個(gè)更多是經(jīng)驗(yàn)性的東西,我也難說(shuō)做得很好。保持代碼可讀性是為了日后你或者別人回來(lái)看代碼能看得懂。保持函數(shù)的單一職責(zé)很有必要,當(dāng)你發(fā)現(xiàn)有些代碼重復(fù)寫(xiě)了幾次就應(yīng)該思考這是否應(yīng)該放到一個(gè)函數(shù)中。你必須明白的是 Bug 總是會(huì)有的,總有一天你或者別人會(huì)重新看這些代碼,如果在寫(xiě)的時(shí)候稍加注意,后期的維護(hù)和復(fù)用就會(huì)相對(duì)簡(jiǎn)單輕松。

具體可以看下代碼大全、代碼整潔之道和這個(gè)視頻。

最后,制作游戲很有趣,寫(xiě)游戲代碼也很開(kāi)心,希望你也能享受游戲編程的快樂(lè)!

推薦書(shū)籍

游戲設(shè)計(jì)、原型與開(kāi)發(fā)

Data Structures for Game Programmers

游戲編程模式

代碼大全

代碼整潔之道

游戲人工智能編程案例精粹

代碼本色:用編程模擬自然系統(tǒng)

Game Coding Complete

Game Programming Algorithms and Techniques

Shaders for Game Programmers and Artists

Unity 著色器和屏幕特效開(kāi)發(fā)秘笈

來(lái)源:游資網(wǎng)

新浪聲明:新浪網(wǎng)登載此文出于傳遞更多信息之目的,并不意味著贊同其觀點(diǎn)或證實(shí)其描述。


版權(quán)聲明:

1、 網(wǎng)站注明“來(lái)源:中國(guó)通信工業(yè)協(xié)會(huì)電子競(jìng)技分會(huì)”的所有作品,其他媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)必須注明:“來(lái)源:中國(guó)通信工業(yè)協(xié)會(huì)電子競(jìng)技分會(huì)”。

2、凡本網(wǎng)站注明“來(lái)源:XXX”的作品,均轉(zhuǎn)載其它媒體,轉(zhuǎn)載目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點(diǎn)和對(duì)其真實(shí)性負(fù)責(zé)。本網(wǎng)站提供的資料如與相關(guān)紙質(zhì)文本不符,以紙質(zhì)文本為準(zhǔn)。