天天看點

遊戲程式設計十年總結(上)

    自敲第一行代碼起,已經十年多了,今天既不是十年整的日子,也不是一個有特定意義的日子,本來像這種大總結的文章,當擇良辰吉日,齋戒沐浴三日,方可動筆。一開始計劃是寫一篇五年總結的,但各種原因一拖再拖,于是就變成了十年總結。光陰似箭,時不我待,轉眼已經在奔三的路上了,離大叔的稱呼很近了,但離大神的稱呼還很遠,在此謹以此文總結反思這十年技術生涯的點滴,與諸君共勉。

程式設計之前

    大概是讀初一的時候,家中有幸讓我得到了一台二手電腦,那時的心情比現在讓我得到一堆蘋果電腦更加興奮。但這是一台不能連網,也沒有任何遊戲和軟體的電腦(掃雷、紙牌接龍等内置程式除外),這樣的電腦能有什麼用呢?隻能瞎折騰,很快電腦被折騰壞了。去電腦店修了幾次之後(被宰了幾次),決定自學電腦維修。

    跑了很多書店才買到跟電腦維修相關的書籍,也就是在這時建立了對計算機的初步認識,并掌握了屢試不爽拔插記憶體條、重裝系統大法。還從幫我修電腦的大叔身上學到了修電腦的裝逼套路,在幫别人修電腦時不論如何,一定要進一下BIOS搗騰一下,一定要在DOS的黑視窗下快速地敲幾條指令,讓旁人看不懂,以彰顯我的技術高超。在2002年左右,像老家那種小地方,估計會重裝系統的人都不多。

    之後從修電腦的大叔那買了不少遊戲碟,如CS、紅警、帝國、炎龍騎士團等等,安裝遊戲是一個隐藏天賦,隻要把遊戲碟插入光驅中,這個隐藏天賦就會被自動激活,自己摸索着把遊戲裝上去。從此電腦上的内容開始豐富了起來,獲得了近視成就。玩遊戲的同時也對遊戲和遊戲的背後産生了濃厚的興趣,那時候經常會思考遊戲是怎麼做出來的?實際上更多的同學比我接觸電腦和遊戲更早,但他們對遊戲的背後并沒有什麼興趣,是以他們現在很多都成了小老闆,而我成為了苦逼的程式員。

初學程式設計

    2005年的某日,應該是在資訊技術或數學課上,第一次接觸到了程式設計語言Basic,一開始用的并不是VB6.0,而是一個藍底黃字的指令行IDE,雖然隻能倒騰出HelloWorld和一些簡單的數學程式,但對此仍然有着濃厚的興趣,因為我知道了遊戲是通過程式設計來實作出來的,那時候滿腦子都是,遊戲是怎麼做的?但沒人告訴我,我隻能自己探索。

    這時候對程式的了解,也隻是最簡單的一些文法而已,直到一個親戚送了一套VCD,是開天辟地的視訊教程,裡面介紹了VB6.0,在我看來,那是非常适合新手,培養程式思維的一套教程,在大叔那買了3塊錢一張的VB碟子,裝上VB6.0之後,就跟着視訊中的示例操作起來了。于是我寫出了人生中的第一個遊戲,一個猜數字的小遊戲,并嘗試着改變遊戲的規則,制作類似石頭剪刀布這樣的遊戲。

    視訊教程中的東西很少,很快就學完了,但這遠遠不夠,我隻能寫出一些簡單的數字遊戲,尋找新的資料成了當務之急,但騎着單車翻遍了老家周圍方圓十幾公裡的新舊書店,都沒能找到合适的資料,如果是在廣州深圳這樣的城市或者是像現在這樣的網絡環境,應該可以很快地找到合适的資料,最後通過學校的上機課,上網找到了一本《Visual Basic遊戲程式設計21天自學通》的書,學校的網速經常隻有幾KB,尋找以及下載下傳這本書都相當不易,實際上這本書也不是最适合我的,中間存在嚴重的知識斷層,但是最終我硬着頭皮挺過去了。

    書中的第二個例子是一個模拟細胞生存的遊戲,裡面用到了一些簡單的資料結構和算法,但在這時候我還不知道什麼是資料結構,對書中的代碼盡是問号,大約經過了一周的死磕,在炎炎夏日,昏暗悶熱的小房間裡,汗水不斷流進眼中,不為所動,因為完全沉浸在代碼中了,全神貫注地做一件事情,這是一種奇妙的感覺,這段回憶很是深刻。

    最後終于将細胞生存的遊戲跑起來了,這是我到目前為止寫過最酷的東西了,并且在這個例子中領悟了簡單的資料結構與算法,貪吃蛇怎麼寫?飛機遊戲怎麼寫?俄羅斯方塊怎麼寫?五子棋怎麼寫?似乎都能從腦海中模拟出來了,應該用怎樣的結構,怎樣的邏輯?我想這就是初步的程式思維了。接下來的時間裡,我将腦海中想到的遊戲都一個一個地實作了,雖然實作的效果看上去慘不忍睹(使用Windows自帶的畫圖工具繪制)。但依然是很有成就感的。細胞生存小遊戲用的大概是一個簡單的圖結構,在做貪吃蛇的時候,依葫蘆畫瓢,寫出了一個連結清單結構,然而直到後面學習c語言的時候,我才知道這是資料結構、是連結清單......

    雖然寫出了一些簡單的遊戲,但我想寫的遠不止這些,我想變強啊啊啊!!!我想寫出更好玩更炫酷的遊戲,就像當時非常火的遊戲《大話西遊》,什麼代碼可以寫出這麼炫酷的畫面,什麼代碼可以讓兩個人的螢幕同步出現這麼炫酷的畫面呢?後來在雲大組織的廣州skynet大聚會上面讨論實時同步方案時,提到過在高中時就有在思考大話西遊的實時同步,大家都笑了,這是一句緩解個人緊張情緒的話,但并不是信口開河。

    《Visual Basic遊戲程式設計21天自學通》介紹了DirectX,看上去使用它就可以寫出更酷的遊戲,但書中的代碼片段無法編譯,而且并不是循序漸進地介紹DirectX,掙紮了很久隻能放棄。

    在這之後,又學習了一下ASP、Html以及JavaScript,這一方面是因為對網頁開發也略有興趣,另外一方面主要還是沒有好的學習資料,有什麼資料就學什麼。

    當我知道,做遊戲應該用C/C++語言的時候,就開始尋找C/C++的資料,那時候沒有找到合适的入門書籍,不知從哪裡找來一本VC++的程式設計書,一上來就是MFC架構的消息映射,各種控件等等,讓我覺得,C++真的好難啊。

    學校的上機課,我都用來找資料,下載下傳資料。在網上找到了一些簡單的C語言資料,開始自學C語言,那時候最最讓我頭疼的就是指針了,聽很多人說指針很難,是以在這方面下了不少功夫。初步掌握了C語言之後,接下來開始學習一本《C語言遊戲程式設計從入門到精通》,雖然沒讓我精通,但還是跟着寫了一些簡單的小東西出來,學到了不少古董級的知識,例如如何用圖形模式調用哪些系統中斷來繪圖,這些大概是最古老的像素遊戲的開發技術了。

   學生的時間是最多的,上課的時間,腦海裡想的都是遊戲程式設計,偷偷地看着程式設計書籍。高中三年過得很快,轉眼就到了聯考。像我這種不愛學習不認真上課的人,自然考不出好的分數,那時候對未來的憧憬大概就是,如果考得不好,那就在一家小網吧裡面當當網管,修修電腦,繼續這種自學程式設計的日子。最後聯考雖然沒考好,但還是考上了位于韶關的一所沒有什麼名氣的大專學院,在那裡,由于佛祖的庇佑,我的技術迎來了一個飛躍,并結識了不少益友。

大學之路

    聯考之後的暑假,決定系統地學一下C++,由于家裡拉上了寬帶,是以極大友善了我找資料,在網上找到了孫鑫老師的C++視訊,通過這套視訊對C++、面向對象和MFC,都有了一個初步的了解,但對很多概念都還是一知半解。

    暑假很快就過了,2008年的九月份,來到了學校報到,飽受了缺乏資料之苦後,看到大學圖書館中海量的計算機書籍,仿佛幾年沒吃肉的人看到一盤美味的紅燒牛肉!這次的興奮僅次于得到生命中的第一台電腦。在圖書館中找了一些VC++21天自學通之類的書籍,鞏固了一下C++基礎,以及如何使用C++來開發遊戲的《VC++遊戲開發》一書,讀完後嘗試着用了GDI寫了一些遊戲,例如《坦克大戰》(這個應該是第二學期做的)。另外也鞏固了一下VB的基礎,使用VB做了一個簡單的系統管理工具,有點類似優化大師。

    由于高中階段的努力,讓我自認為在同齡人中的技術已經是很不錯,開始有些驕傲膨脹的時候,蚊子和志仔的出現狠狠地打擊了我的“嚣張氣焰”,學無止境,一旦滿足于目前的技術,那便是逆水行舟不進則退。

    蚊子并不是我們學校的,是一位大學同學的高中同學,同他一見如故(其實那時候尚未見面),但相似的經曆,對技術的熱愛,讓我們有很多的共同語言。蚊子和志仔都是從高中便開始自學程式設計,并且學得比我好得多,大一時蚊子已經制作了不少看上去還不錯的軟體作品,對遊戲外挂也略有研究,蚊子推薦給我的《Windows遊戲程式設計大師技巧》,讓我受益匪淺,後來此書成為了少數幾本我反複翻閱多次的書。《C++Primer》和《EffectiveC++》是另外的兩本,通過這些比較經典的書,我慢慢了解了C++和VC++的差別,面向對象、泛型。

    志仔是一個超級邋遢的人,發型雜亂,每次見他都穿着拖鞋和大棉襖,然後挂着一條鼻涕。但很多時候看上去越邋遢的程式員越牛逼,大一的時候他就已經在研究木馬之類的東西了,不是簡單地使用工具,而是開發木馬,終端控制,螢幕傳輸,視訊壓縮等等,都是他自己做的。對于php等網頁程式設計,他也頗為擅長,對于OpenGL和一些圖形學算法也有研究,這兩個家夥都自己寫過作業系統(當然,不是大一的時候),畢業之後,他們變得更牛逼了。受志仔和凱文米特尼克的影響,那時候花了一段時間玩了玩黑客,但僅僅隻是停留在表面,玩了一段時間發現,程式設計才是王道,于是丢下手上的黑客工具包,繼續回到程式設計的正道上,有牛逼的對手一起前進,路上才有意思,這種互相競争互相追趕的感覺非常地美妙。

    大學前期基本都是圍繞着C++遊戲開發學習的。在大一的第二個學期,接觸了彙編語言,這是一種與之前的語言完全截然不同的語言,需要運用新的思維方式,應該算面向寄存器程式設計,看了一些彙編教程之後,自己調用各種中斷,用彙編寫了一個打飛機的小遊戲。在後面接觸了面向對象的思想之後,就漸漸把彙編忘幹淨了。在五一的3天假期中,準備了泡面在宿舍悶了3天時間,把之前沒看完的孫鑫視訊看完了,初步了解了C++的類、MFC、多線程、網絡程式設計。并制作了一個内網聊天工具,在網上斷網之後可以和其他宿舍的同學聊聊天。

     從大學開始就總是給自己制定着一堆完不成的學習計劃,因為不想讓自己有借口停止學習。特别是寒暑假,回家的行囊中總是塞滿了計算機的書。

     大二之後,我漸漸被兩位大牛甩在了後面,因為認識了我現在的老婆,這是一段一波三折的複雜故事,這裡就略過不談了。雖然學習的時間少了很多,但大二這一年還是看了不少書,例如C++Primer、EffectiveC++等等,對C++的了解上升了一個層次。DirectX3D相關有Windows遊戲程式設計大師技巧,精通DirextX3D圖形與動畫程式設計、DirectX9.03D遊戲開發程式設計基礎等等,OpenGL相關的有OpenGL遊戲程式設計、Nehe的OpenGL教程以及計算機圖形學等等,對3D程式設計的了解又上升了一個層次,計算機圖形學一書介紹得非常深入,如果完全了解了此書的内容,幾乎可以不依靠OpenGL和D3D手動實作一個軟渲染3D引擎。另外由于課程需要,還系統學習了Java語言,看完馬士兵的Java視訊,非常過瘾,順帶學習了一下設計模式,感覺對面向對象的了解又上升了一個層次。如果說大一學習的是如何将代碼寫對,那麼大二學習的更多是如何将代碼寫好。

     除了看書之外,大二還做了一些兼職,例如在勤工儉學那邊幫忙送桶裝水,送一桶水大概能賺5毛錢。與這種苦力活比起來,賺大錢的腦力活更适合我,輔導員給我和志仔介紹了一份兼職,維護一個PHP門戶網站,每個月兩三百的收入在那時看來已經頗為豐厚了,做這份工作也學到了蠻多東西,例如mysql資料庫,還有網頁抓取,正規表達式等等。

     除了看書和兼職之外,另外還做了一些小玩意,例如用自己寫的簡陋的OpenGL遊戲引擎做了個3D的坦克小遊戲(3D模型檔案的加載是自己在官網研究這種檔案格式,然後手寫的一個模型檔案解析和渲染類),另外還學習了生命中的第一個遊戲引擎——HGE,在七夕的這天花了一個上午用HGE制作了一個《鴨子下樓梯》小遊戲送給了老婆。其他還用Java、VB、C++寫了一些亂七八糟的軟體。

    大三時,程式設計基礎勉強還算可以了,對C/C++掌握到一定程度之後,學習其他語言都非常快。大三隻在學校待了兩個月,然後就提前出來工作了,這兩個月裡就做了兩件事情。參加一場比賽和一場考試,學期開始時輔導員跟我說讓我去深圳參加一個省裡面的比賽,有很多學校參加,這讓我很興奮,大一入學時,就聽到老師說某某學長在廣東省的XX比賽中拿到了三等獎,那時心裡滿是羨慕和崇拜,而現在輪到我了。

    我決定用HGE制作一款塔防遊戲,和老婆組隊(老婆是美術),第一個星期簡單地學習了Lua和Delphi,然後用HGE搭建了遊戲架構,使用Lua編寫遊戲邏輯,另外再用Delphi寫了一個簡單的遊戲編輯工具,寫到差不多的時候出現了一個重大事故,硬碟壞了,無法修複,是希捷的固件門,于是隻能重新寫過,幸好前些天去機房的上機課把代碼拷過去看過,損失并不算太嚴重,但從此再也不敢用希捷硬碟了。

    現在看來當年的這款作品實在是非常糟糕,但憑借着上台演說時的對答如流,僥幸拿了一個一等獎。如果志仔也來參加的話,一定可以拿出一個比我好很多的作品,但他總是神龍見首不見尾。比賽之後開始潛心準備軟考,2010年的軟考還是蠻難的,考的内容特别廣,包括什麼編譯原理、網絡等一大堆東西,考試時發現蠻多成年人來考的,學校參加這個考試的人不多,通過的就更少了,僥幸通過之後,就開始準備履歷,打算到廣州或深圳好好曆練一番。

    美好的大學生活就這樣提前告一段落了,人總是在失去之後才懂得珍惜,工作之後回過幾次母校,每次回去,看着熟悉的場景,回想起和同學朋友們在學校渡過的時光,心中總是百感交集。大學生活結束了,但另外一段苦逼的故事即将開始......