游戲編程十年總結(上)


    自敲第一行代碼起,已經十年多了,今天既不是十年整的日子,也不是一個有特定意義的日子,本來像這種大總結的文章,當擇良辰吉日,齋戒沐浴三日,方可動筆。一開始計划是寫一篇五年總結的,但各種原因一拖再拖,於是就變成了十年總結。光陰似箭,時不我待,轉眼已經在奔三的路上了,離大叔的稱呼很近了,但離大神的稱呼還很遠,在此謹以此文總結反思這十年技術生涯的點滴,與諸君共勉。
 
編程之前
    大概是讀初一的時候,家中有幸讓我得到了一台二手電腦,那時的心情比現在讓我得到一堆蘋果電腦更加興奮。但這是一台不能連網,也沒有任何游戲和軟件的電腦(掃雷、紙牌接龍等內置程序除外),這樣的電腦能有什么用呢?只能瞎折騰,很快電腦被折騰壞了。去電腦店修了幾次之后(被宰了幾次),決定自學電腦維修。
    跑了很多書店才買到跟電腦維修相關的書籍,也就是在這時建立了對計算機的初步認識,並掌握了屢試不爽拔插內存條、重裝系統大法。還從幫我修電腦的大叔身上學到了修電腦的裝逼套路,在幫別人修電腦時不論如何,一定要進一下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年的軟考還是蠻難的,考的內容特別廣,包括什么編譯原理、網絡等一大堆東西,考試時發現蠻多成年人來考的,學校參加這個考試的人不多,通過的就更少了,僥幸通過之后,就開始准備簡歷,打算到廣州或深圳好好歷練一番。

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

 

 
打賞

免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號  © 2018-2021 CODEPRJ.COM