作者: Radu Privantu 譯者:pAnic 2005年5月11日 原文鏈接:http://www.devmaster.net/articles/building-mmorpg/ 譯者序:這是一篇講解如何開發一款MMORPG的入門文章,作者本人也是一款游戲的開發者,文中的內容源于實踐,有很高的參考價值。很多人都想擁有自己的游戲,這篇文章對那些想自己開發游戲的人來說可能是一紙福音,也可能是一盆冷水。無論如何,開發游戲都不是一件簡單的事情。 以下是翻譯正文: |
[/td] | ||||||||
文章的中心是如何起步開發你自己的 大型多人在線角色扮演游戲( 原文:Massive Multiplayer Online Role Playing Games) (MMORPG)(譯者注:俗稱:網絡游戲,網游)。 針對的讀者是經驗和資源有限的開發者。 讀完文章之后,你應該懂得如何起步, 還有一些關于什么是應該做的和不應該做的忠告。第一步是評估你的能力和資源。你必須對自己誠實,因為做你力不從心的事情會浪費你的時間并讓你心灰意冷。 第一步:評估你的能力必須的技能:
基本軟件構架首先,嘗試創建一個簡單的C/S模型,有如下功能:
第三步:選擇數據傳輸協議又是看起來很簡單,其實不然。你不能只是發送'\0'結尾的串。因為你需要一個通用的協議,能同時適用字符串和二進制數據。用0(或其他字符)做結束符是不明智的,因為那個結束符可能是你要發送的數據的一部分。此外,如果你發送20字節,然后再20字節,服務器極有可能收不到兩個20字節的包。取而代之的是,它會一次性收到40字節,這是為了避免浪費帶寬在不必要的頭上。 而且,你可以發送1KB的包,但服務器會以兩個小包的形式收到它。所以你必須知道哪里是一個包的開始,哪里是結束。在 “永恒大陸”(譯者注:原文: Eternal Lands,本文的作者正在開發的一款MMORPG)中,我們用如下的方法:
下一件事是決定服務器模型: “非阻塞soket,不使用線程”,或者“阻塞soket,使用線程”。兩種方法(使用線程 vs 不使用線程)各有優缺點。 線程:
第四步:客戶端你打算做2D還是3D游戲?有些人認為2D游戲做起來簡單。我兩者都做過,并且我傾向于3D游戲更簡單。容我解釋。 2D下,你通常有一個幀緩沖,也就是一個巨大的象素點數組。象素點的格式會因顯卡的不同而不同。 有些是RGB模式,另一些是BGR模式,等等。每種顏色的bit數也會不同。只有在16bpp模式才有這個問題。8-bit和24-bit模式簡單一些,但有他們各自的問題(8-bit顏色數太少(256),而24-bit速度更慢)。同時,你需要制作你的精靈動畫程序,不得不自己排序所有對象,以便他們以正確的順序繪制。 當然,你可以用OpenGL或者D3D制作2D游戲,但通常這并不值得。并不是所有人都有3D加速卡,所以使用3D庫開發2D游戲一般會帶給你兩者的缺點:不是所有人都能玩,你也不能旋轉攝像機,擁有漂亮的陰影,和3D游戲炫目的效果。(譯者注,目前絕大部分顯卡都支持565的16bpp格式,這個也成為目前16位色的業界通用格式,有不少文章和代碼都是講述這一格式下圖像處理的,尤其是使用MMX技術) 3D的途徑,正如我所說,更簡單。但是需要一些數學(尤其是三角)的知識。現代的圖形庫很強大,免費提供了基本的操作(你不需要從后到前排列對象,改變物體的色彩和/或帖圖都十分簡單,對象的光照會按照光源和它的位置計算(只要你為它們計算了法向量),還有更多)。并且。3D給了你的創作和運動更多的自由度,缺點就是不是所有人都能玩你的游戲(沒有3D卡的人數可能會讓你大吃一驚的),并且,預渲染的圖片總是比實時渲染的更漂亮。(譯者注:市面上想買不支持3D的顯卡目前很困難,只是高性能的3D卡價格也不低) 第五步:安全顯然,不能相信用戶。任何時候都不能假設用戶無法破解你精巧的加密算法(如果你使用了的話)或者協議,用戶發送的任何信息都要通過驗證。極有可能,在你的服務器上,你有固定的緩沖區。例如,通常有一個小(可能是4k)緩沖區用來接收數據(從soket)。惡意用戶會發送超長數據。如果不檢查,這會導致緩沖區溢出,引起服務器癱瘓,或者更壞的,這個用戶可以hack你的服務器,執行非法代碼。每個單獨的消息都必須檢查:緩沖區是否溢出,數據是否合法(例如用戶發送“進入那扇門”,即使門在地圖的另一端,或者“使用治療藥水”盡管用戶沒有那種藥水,等等)。 我再次強調,驗證所有數據非常重要。一旦有非法數據,把它和用戶名,IP,時間和日期,和非法的原因記錄下來。偶爾檢查一下那個記錄。如果你發現少量的非法數據,并且來自于大量用戶,這通常是客戶端的bug或者網絡問題。然而,如果你發現從一個用戶或者IP發現大量非法數據,這是明顯的跡象表明有人正在欺騙服務器,試圖hack服務器,或者運行宏/腳本。同時,決不要在客戶端存儲數據。客戶端應該從服務器接收數據。換句話說,不能發送這樣的消息“OK,這是我得物品列表”或者“我的力量是10,魔法是200,生命值是2000/2000”。 而且,客戶端不應收到它不需要的數據。例如:客戶端不應該知道其他玩家的位置,除非他們在附近。 這是常識,給每個人發送所有玩家會占用大量帶寬,并且有些玩家會破解客戶端從中獲取不公平的利益(像在地圖上顯示特定玩家的位置)(譯者注:就像傳奇的免蠟燭外掛)。所有這些似乎都是常識,但,再次,你會驚奇的發現有多少人不知道這些我們認為的常識。 另一個要考慮的問題,當涉及到安全:玩家走動的速度必須在服務器計算,而不是客戶端。(譯者注:這是重要的原則,但是會耗費大量服務器資源。魔獸世界沒有這樣做,它采用類似其他玩家揭發的形式掩蓋這個事實,導致加速外掛可以用,但是在有其他玩家的時候會暴露)。服務器應該跟蹤時間(以ms為單位)當客戶最后一次移動的時候,并且,移動的請求如果比通常的極限更快到來,這個請求應該被拋棄。不要記錄這類虛假請求,因為這可能是因為網絡延遲(也就是玩家延遲,過去的10秒內發送的數據同時到達了)。 檢查距離。如果一個玩家試圖和100億公里以外的玩家交易(或者甚至在另一張地圖上),記錄下來。如果一個玩家試圖查看,或者使用一個遙遠的地圖對象,記錄它。小心假的ID。例如,正常情況下每個玩家都會分配一個ID(ID在登陸的時候分配,可以是持久的(唯一ID)。 如果ID在玩家登陸的時候賦予9或怪物被創建的時候),顯然可以用玩家數組(保存玩家)的位置(索引)作為ID。 所以第一個登陸的玩家ID是0,第二個是1,依此類推。現在,通常你會有一個限制,比如說2000個索引在玩家列表里。所以如果一個客戶端發送一條命令類似:“查看ID200000的角色”,這會使服務器當機,如果沒有防備的話,因為服務器會訪問非法的內存區域。所以,一定要檢查,就像這樣: "if actor id<0 or if actor id> max players 然后記錄非法操作并且斷開玩家。如果你使用C或者C++,注意或者定義索引為'unsigned int' 并且檢查上限,或因為某些原因定義為int(int,默認是有符號的),記得檢查 <0 and >max 。沒有做這些會嚴重挫傷你和其他用戶。類似的,要檢查超出地圖坐標。如果你的服務器有某種尋路算法,并且客戶端通過點擊地面來移動,確保他們不要點擊在地圖外部。 第六步:獲得一個團隊制作游戲需要大量的工作(除非是個Pong and Tetris游戲)。尤其是MMORPG。你無法單靠自己。理論上,一個完整的團隊組成是這樣:
一開始就湊齊10~15人幾乎是不可能的。不管你在不同的論壇發多少帖,你也無法找到合適的團隊成員。畢竟,如果一個人在他/她的領域得心應手,為什么在你無法拿出任何東西的時候他/她要加入你的團隊?很多人有遠大的想法,但是實現它們需要大量時間和努力,所以他們寧可從事自己的工作也不會加入你。那如果你需要10~15人,但是無法讓他們加入你的團隊,你如何才能制作一款MMORPG呢? 好,事實上,你一開始不需要所有人都到位。你真正需要的是一個程序員和一個美工。如果你是個程序員,只要找個美工就可以了。請求懂美術的朋友幫忙,花錢請大學生/朋友做一些美術或者其他工作。 現在你有了一個美工,你期待的游戲的樣子,現在可以開始實現了。一旦你有了可以運行的C/S引擎,一些用來展示的截圖(或者更好,玩家可以登陸你的世界,四處走動,聊天),更多的人會愿意加入你的團隊。更恰當的是,除非你使用獨有的技術,否則你的客戶端可以開源。許多程序員會加入(作為志愿者)一個開源工程而不是非開源項目。而服務器不應該開源(除非你打算做一款完全開源的MMORPG)。 其他一些忠告:在有東西可展示之前,不要夸大你的游戲。最惹人煩的事情之一就是一個新手發一個“需要幫助”的請求,并且解釋這個游戲到底有多酷,最后要求一個巨大的團隊加入他的游戲制作。一旦你擁有了網站廣告(通常是在一個免費主機),你會看到一個吸引人的導航條,包含“下載”,“截圖”,“ 原畫”(譯者注,原文:Concept art,概念藝術,在游戲應該指美工的原始設計),“論壇”。你點擊下載鏈接,然后看到美妙的“建設中”頁面(或者更糟糕,一個404錯誤)。然后你點擊截圖,得到同樣的結果。如果你沒有東西給人下載,就不要放下載鏈接。如果沒有截圖展示,不要放截圖鏈接。然而更好的是,在工程進展10%(程序和美工)之前,不要浪費時間在網站上。 第七步:打破某些神話
迄今為止我列舉的所有事情,加上額外的工作和挑戰,足以讓你在決定涉足這個工程之前三思而行。你必須知道你的決定意味著什么。 總結希望這篇文章能給你足夠的知識。我的下一篇文章將介紹如何建立一個經濟系統(更明確的,要避免哪些錯誤),還有一些調試服務器和客戶端的信息。 關于作者這篇文章作者是 Radu Privantu, 永恒大陸(Eternal Lands) www.eternal-lands.com的主程序和項目規劃, 永恒大陸是一款免費,客戶端開源的MMORPG。作者可以通過 chaos_rift at yahoo dot com 聯系。 |