從零開始學游戲編程
開發(fā)游戲可能是學習編程的理由中最吸引人的一條了。但如何從零開始入門,達到能夠開發(fā)游戲的編程水平,是困擾無數(shù)勇敢少年們的傳統(tǒng)難題。作為一名游戲設計師,我沒有系統(tǒng)地學習過編程。從5年前開始,我有了自己從頭完整開發(fā)游戲的念頭,于是斷斷續(xù)續(xù)地看了很多書,試過了很多入門方法和開發(fā)環(huán)境,但直到近半年才找到正確的門路。現(xiàn)在我在Unity開發(fā)環(huán)境下獨立制作游戲原型和利用成型的框架完善游戲功能已不成問題。
本文會介紹如何從零開始學習游戲開發(fā)編程的方法,希望能為和我一樣掙扎在編程大門之外的游戲開發(fā)愛好者們提供幫助。不過事先要說明的是,這種學習思路是為了幫助你在做游戲的過程中逐漸學習編寫程序,不適用于其他領域,但作為一種入門方法,它能讓你在半年到一年的學習之后,做到獨立制做小游戲(或原型)。
門外漢學編程的難點
介紹學習方法之前,我們先看看門外漢學編程最常遇到的問題。
第一,程序員們經(jīng)常說程序語言只是編程工具,但市面上常見的教程都喜歡從語法、算法和程序語言的使用思想開始教學,而不是把編程語言當做解決實際問題的工具來入手。因此,初學者經(jīng)常耗費很大精力才能理解書上寫的算法和思想,卻完全不知道理解之后能用來做什么。
第二,很多編程教程雖然配有實例,但一方面例子的學習難度曲線增加得很快,剛看完一個“Hello World”實例,下一個例子可能就變成教你如何分配內(nèi)存(真實的故事,我的一本學習Objective-C的教程就是這樣的)。另一方面初學者在對開發(fā)流程不熟悉的情況下,很難做到舉一反三,從一個實例里總結出做另外三個游戲的方法,我經(jīng)常遇見看了三個不同類型的游戲實例,放下書后卻連一個游戲都做不出來的情況。
第三,很多編程教程為了提高普適性,在使用現(xiàn)成架構方面都很保守,導致了很多重復造輪子的教程出現(xiàn)。例如在前幾年Cocos2D(一個用于iOS平臺游戲開發(fā)的游戲引擎)還沒有現(xiàn)在這么火時,幾乎所有的iOS游戲開發(fā)教程講的都是如何使用OpenGLES來制作游戲圖像,而這些底層架構的實現(xiàn)對初學者來說是根本不可能完成的任務。
因此,適合初學者的學習方針是:從實際需求出發(fā);“怎么做”優(yōu)于“為什么”(為什么可以在入門之后再慢慢理解);使用允許你偷懶的工具或架構(需要做的越少越好)。這些要求其實很容易滿足,答案恰恰在看起來和編程關系不大的領域——可視化編程工具里(Visual Programming Tools)。
可視化編程游戲引擎讓你先做再想
可視化編程泛指一切使用可視化元素的操作代替文本輸入的程序設計方式,大體上就是像畫流程圖一樣通過連接若干“盒子”和“箭頭”來實現(xiàn)程序邏輯。這個概念在游戲開發(fā)工具上的應用越來越流行,近年來還有井噴趨勢,從老牌的GameMaker、RPGMaker、TorqueGameBuilder、到新興的GameSalad、Construct 2和Unity都是其中的代表。盡管這些工具和引擎各有不同的開發(fā)方式,但它們都能讓初學者在完全不懂編程語法和復雜算法的情況下快速實現(xiàn)自己的游戲設計。
我之前的態(tài)度是寧可抱著“看也看不懂,看懂了也不會做”的書苦學XNA(一個微軟發(fā)布的使用C#的游戲開發(fā)架構)和Cocoa(蘋果發(fā)布的使用Objective-C的應用開發(fā)架構),也不屑于使用GameMaker、GameSalad之類的圖形界面開發(fā)工具。認為這些工具屬于“業(yè)余型”,就算能做出游戲來也是旁門左道,不能修煉內(nèi)功。
直到有一次參加了柏林獨立游戲BIG Jam的活動,接觸了很多非常優(yōu)秀的游戲開發(fā)者。他們大部分人都把GameMaker和Flash這些簡單的工具當做制作獨立游戲的最佳選擇。原因是他們多年以前開始學習游戲開發(fā)時使用的就是這些工具,常年的使用經(jīng)驗讓他們能在最短的時間里用這些工具實現(xiàn)想法。而使用這些工具從頭到尾制作了大量游戲的經(jīng)歷,也在他們以后學習用編程語言開發(fā)游戲時打下了很好的基礎。
從那之后,為了快速開發(fā)原型,我開始物色入門級的可視化編程游戲引擎。HTML5游戲引擎Construct 2偶然進入了我的視線;ㄊ畮追昼妼W習教程實例之后,我很快用幾個小時做出了一個一直在構思的游戲想法(當然想法本身就很簡單,而且制作過程中碰到實現(xiàn)困難的設計都進行了進一步簡化)。說來慚愧,盡管在主機游戲業(yè)從業(yè)多年,這次使用Construct 2的開發(fā)過程中我第一次感覺到對游戲開發(fā)的整個過程和架構有了初步認識。
首先,可視化編程工具里一般都有一個現(xiàn)成的游戲場景(任何游戲開發(fā)過程中都需要一個畫布或一個攝像機來描述玩家可以看到的圖像范圍),然后你需要把游戲中需要的各個元素(一般稱為Actor,例如主角、敵人、子彈等,這就是編程語言里對象的概念)放進場景里,然后通過關聯(lián)邏輯模塊來讓它們快速互動起來。Construct 2的邏輯模塊使用了非常貼近編程語言的按行號從上到下的執(zhí)行順序。而且你將從教程中學習到,原來游戲開始運行后每一幀都會按順序執(zhí)行一遍所有的邏輯,這就是游戲開發(fā)的基本框架中最常說的主游戲循環(huán)(Main Game Loop)。
除此之外,用戶使用邏輯模塊時不用擔心語法錯誤和算法的設計,一般這類引擎里都會提供大量現(xiàn)成的算法模塊可供挑選。只要專注于設計游戲邏輯,其他事情可以說都是軟件自動幫你完成。在觀看教程和其他范例項目時也一目了然,學習別人的設計思想更加容易。
通過使用Construct 2獨立完成了第一個游戲原型后,我學到了相似的游戲元素可以共享一部分屬性(編程語言里使用類和繼承的概念);學到了所有活動的游戲元素都需要在每一幀的循環(huán)里進行驅動,每幀只運動一小段距離;還學到了應該在主游戲循環(huán)的什么位置判斷是否Game Over,以及Game Over時進入另一個循環(huán)來等待玩家重新開始游戲等內(nèi)容。
這段經(jīng)歷讓我認識到有能力從頭到尾制作游戲(或者原型)對于游戲開發(fā)的理解有多么重要。但有一個問題出現(xiàn)了—如果可視化工具那么好用,那為什么還要繼續(xù)學習編程呢?我當時也光顧著高興了,并沒有從可視化編程工具轉到真正編寫代碼的計劃,直到……
由需求出發(fā)向編寫代碼的轉型
直到我打算做個稍大一點的戰(zhàn)略游戲項目,才開始在各種游戲開發(fā)工具中碰壁。接連嘗試了Construct 2、GameMaker、Stencyl,可不管哪一個工具都無法很容易地提供我所需要的數(shù)據(jù)結構。重新審視了需求的增加和工具的局限性之后,我才決定開始學習Unity下的C#編程。在請教了團隊里的程序員和有針對性地學習了一部分數(shù)據(jù)結構知識后,我終于在Unity中搭建出了設計需要的基本游戲結構。并在之后開始正式學習Unity的C#腳本,一步步地掌握了C#里類的繼承、列表和字典的使用與委托等難以讀懂,學了也不知道怎么用的概念。
剛開始在Unity開發(fā)環(huán)境里獨立制作游戲原型時,我也感覺從零開始獨立完成所有的代碼非常和困難。但幸運的是,Unity引擎有個特點,就是有一個內(nèi)容非常豐富的插件市場,其中最流行的插件類型之一就是可視化編程插件。這些插件(PlayMaker、uScript、Antares Universe等)將Unity游戲開發(fā)的常用功能打包成函數(shù)塊,并按需求類別歸納成組,只要花一點時間閱讀手冊就相當于掌握了Unity里大部分的常用函數(shù)功能。之后用戶通過連接不同函數(shù)塊的輸入輸出接口來實現(xiàn)完整的游戲邏輯。
當時我為了開發(fā)一個動畫狀態(tài)很多的動作游戲原型,購買了PlayMaker插件,并且使用這個插件強大的狀態(tài)和動畫控制功能第一次學習了有限狀態(tài)機的制作和使用。之后又經(jīng)身邊的程序員指點了解到有限狀態(tài)機在游戲開發(fā)中的運用非常廣泛,不光是控制動畫,還可以用來控制菜單和不同條件下需要不同處理方式的很多游戲邏輯。
就像之前的Construct 2一樣,我也只在一個項目中使用了PlayMaker的狀態(tài)機。在了解了有限狀態(tài)機的基本工作方式后,我在之后的項目中都使用了團隊里的程序員開發(fā)的純代碼的有限狀態(tài)機系統(tǒng)(開源的exUnity,還包括其他Unity下的游戲開發(fā)實用架構),完成了從可視化編程到代碼編程的轉型。
這就是Unity下的可視化編程插件很適合用來學習編程的原因:和其他較為簡單的工具的區(qū)別在于,Unity使用JavaScript和C#作為腳本語言,這個環(huán)境下的可視化編程插件只是把C#函數(shù)和腳本打包成了可視化的邏輯塊,并沒有改變其設計思路。
對于初學者來說,用可視化插件組裝起來的游戲邏輯和用C#手動編寫的游戲程序幾乎是一一對應的,有時甚至能精確到函數(shù)段落(例如Antares Universe里的函數(shù)塊就和Unity的全部函數(shù)功能一一對應)。在已熟悉整個設計流程的情況下,只需查閱Unity官方的腳本參考手冊,就能完成從可視化編程到文本編程的翻譯。我經(jīng)過可視化工具的啟發(fā),很快就發(fā)現(xiàn)插件有些臃腫和煩瑣,也無法實現(xiàn)一些需求實現(xiàn)。在接下來的兩個原型中就越來越多地開始手動編寫代碼,對工具的依賴越來越小,直到完全拋棄。
現(xiàn)在可以回答前面提出的“為什么有了不用編程就能開發(fā)游戲的工具,還要學習編程”的問題了。如果你的所有設計需求都可以被可視化游戲開發(fā)工具完成,那么確實不需要進一步學習編程。但如果有的需求無論如何都不能用其他工具完成,那么自己寫代碼來實現(xiàn)就是唯一的出路,這時你有強烈的需求和目標,就可以通過詢問或搜索“怎么做”來學習編程并滿足需求。我的程序員好友經(jīng)常說:“能否學會編程其實只取決于你的需求是否強烈,不得其門而入、或半途而廢的都是需求不夠明確或不夠強烈的人。”
可視化編程工具對于游戲開發(fā)者來說就是一個篩選需求的過程:在硬啃編程書籍時,感覺自己有100個需求,但都不知道從哪開始學習、如何去實現(xiàn);使用可視化工具,可以輕松實現(xiàn)90個需求,剩下10個就被放大并明確化了。接下來依靠上網(wǎng)學習或向他人請教,終究也能自己實現(xiàn)(個別超出能力的需求不要強求,請別人做或者放棄都比鉆牛角尖要好)。
可視化編程工具能夠培養(yǎng)我們由淺入深的思考習慣。先盡可能地用簡單的邏輯去實現(xiàn)設計,如果用“盒子”和“箭頭”無法完成,那么你在尋求代碼上的解決方案時,就回答了“為什么要用這樣的程序設計思想”的問題。經(jīng)歷了這個過程,你對“為什么”的理解會比一開始就去看專門講解“為什么”的大部頭程序書籍深刻許多。而通過實踐理解了需求和程序設計之間的關系后,再去系統(tǒng)地閱讀程序設計教程效果會好得多。
可視化編程雖然依賴于工具,但也能幫助你時刻把“程序語言即工具”的概念裝在腦袋里。之后無論換什么引擎,用哪種語言,首先應該問自己:“這個工具能幫我做什么?我要怎樣做才能實現(xiàn)需求?”另外,程序設計和畫流程圖之間的距離沒有想象中那么大,通過反復用可視化編程工具畫“流程圖”的過程,能夠從實踐中學習各種游戲設計的實現(xiàn)方法,當你能準確地畫出邏輯完美的流程圖時,離你寫出同樣邏輯完美的程序距離已不遠了。更重要的是,在這個過程中你實現(xiàn)了自己的想法,創(chuàng)造出了和書上的例程完全不同的東西,對于增強信心和進一步明確自己的學習需求的作用都是巨大的。
想學寫程序,就要做程序員的朋友
最后講下如何從身邊的程序員那里獲得幫助。初學者想要學寫代碼,有個程序員朋友能讓你獲益良多。當你遇到難題時,請把詢問的重點集中在需求思路和關鍵字上,而不是一味求代碼。高手提供了思路以后自己實現(xiàn),或通過關鍵字自己尋求解決方案,都更有助于水平的提高。
從可視化編程到代碼的轉化中,也可以嘗試使用程序員寫的功能庫或常用的架構。前文中提到不要重復造輪子,當拋棄可視化編程工具時,就要用現(xiàn)成的功能庫來代替。在選用功能庫時,自己信任的程序員推薦的東西總會是一個非常不錯的選擇,他能告訴你一個庫的優(yōu)缺點并且在使用過程中提供技術支持。
我在學寫代碼的過程中,先是自己用最簡單的方式實現(xiàn)功能,然后一邊不斷閱讀和學習同個獨立開發(fā)團隊里程序員的項目結構和代碼,再使用程序員設計或慣用的架構來組織自己的代碼,這樣既能最快地完成工作,又能逐漸養(yǎng)成較好的編程習慣和深入理解程序設計思想。
本文由站河南北大青鳥校區(qū)整編而成,如需了解更多IT資訊類的文章、新聞、課程和學習技巧、就業(yè)案例、招生詳情等問題,可以對在線咨詢老師進行一對一問答!
- 上一篇:軟件測試工程師 越老越吃香
- 下一篇:ACCP課程指點職場翻山越嶺
推薦資訊
- 怎樣避免軟件工程師成為“枯燥”... 2012-12-07
- 如果說IT行業(yè)是吃青春飯那么證明... 2019-09-06
- 2013年做什么行業(yè)可以賺到錢呢?... 2013-02-17
- 青鳥老師告訴您:配置布署無線網(wǎng)... 2012-10-13
- 鄭州電腦培訓選擇哪個品牌學校好... 2019-07-02
熱點資訊
- 在內(nèi)卷和AI之下計算機專業(yè)是不是... 2024-05-10
- 選擇IT行業(yè)的理由是什么呢?什么... 2022-07-16
- 初中畢業(yè)生們?yōu)槭裁赐扑]你選擇職... 2022-05-18
- 上班996,生病ICU,不加班的程序... 2019-04-16
- 鄭州北大青鳥培訓機構6種方法帶你... 2019-04-02