版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章游戲程序實現(xiàn)4.1游戲程序實現(xiàn)基本開發(fā)流程4.2游戲程序基本開發(fā)語言與環(huán)境4.3游戲基礎編程技術4.4游戲高級編程技術4.5游戲引擎應用與開發(fā)技術4.6游戲軟件的測試與優(yōu)化習題
4.1游戲程序基本開發(fā)流程游戲的程序實現(xiàn)過程一般分為三個階段,即編程前階段、編程階段和調試階段。在編程前階段后期開始程序和美術的制作,在編程階段后期開始游戲的調試。三個階段所用的時間比大概為3∶4∶3。4.1.1編程前階段在編寫游戲時,如果只憑借興趣,想到哪就編到哪,隨著程序越來越大,有一個問題就會越來越明顯,那就是程序的錯誤。為了減少錯誤的產生,必須采取一些措施,這就是程序設計。程序設計的必要性還表現(xiàn)在程序員間的合作。為了讓每個程序員對所要做的事和將如何做這件事有個明確的了解,也為了讓管理人員能夠從量的角度了解任務的完成狀況和進度,也要求必須有程序設計。在編程前階段要對游戲程序進行程序設計,編寫相應的設計文檔,定義I/O結構和內部結構。該文檔的偏重點應該是玩家體驗而不是技術考慮,如果有必要就及時調整程序結構。設計文檔主要應包括如下內容:
1.程序設計總綱無論設計什么程序,最先要弄清楚的一個問題就是做什么。程序設計總綱就是要告訴自己和自己的伙伴們,要做的是什么樣的游戲程序??偩V包括以下幾方面:
(1)游戲概述:游戲的背景、類型、操作方法、特點等。
(2)程序概述:游戲程序的編譯平臺、硬件運行需求、語言、編程重點和難點、技術能力分析等。
(3)程序員概述:參與編程的程序員的能力及在整個程序制作中的作用和地位。
(4)程序模塊劃分描述:游戲所需要的所有程序和程序內部的功能模塊的劃分。這部分只要有比較概括的說明就可以了。
2.程序模塊劃分程序模塊劃分是對程序設計總綱中最后一個部分的詳細說明。說明的內容主要有該模塊的功能、接口、技術要點和所用到的軟件底層等。
3.程序開發(fā)計劃知道了要做什么和怎么做,下面就該確定什么時候做和由誰來做了。一般都會制定一系列的里程碑,比如演示版、原型版(體驗版)、測試版和正式版等,在這之間也可能會有其它的版本,然后確定完成每一個版本所需要的時間、主要內容和驗收標準。除此之外,還要給出程序中每個模塊的制作時間的表格及每個程序員的分工說明和工作量說明。4.1.2編程階段游戲計劃完成并得到通過之后,就進入到游戲編程階段。游戲程序的編寫過程與游戲的模塊劃分有關,大致可以分成三個階段:底層制作階段、工具制作階段和游戲制作階段。底層制作一般是最先開始進行的階段,這部分與具體游戲無關,而只與游戲所要運行的平臺和所使用的開發(fā)工具有關。在策劃大綱基本上完成后,也就是游戲的類型、模式基本上固定之后,就可以開始游戲工具的制作了。游戲本身程序的實現(xiàn)是最耗費時間和精力的地方。編程是一件單調而繁雜的工作,需要特別注意細節(jié)問題。游戲不能充分發(fā)揮潛力大多是因為程序員沒有花費足夠的時間和精力,完成得比較倉促,沒有認真調試而引起的。因此,在游戲程序編程完成之后,還要進行嚴格的測試。4.1.3測試階段游戲剛制作完成,肯定會有很多的錯誤,就是通常所說的BUG。任何一款游戲在制作過程中都會有BUG,嚴重時會導致游戲中斷不能正常進行。而且隨著游戲結構越復雜,可能出現(xiàn)BUG的情況就越多。BUG的出現(xiàn)可能是由于程序員的程序編寫問題,也可能是由于策劃的設計問題,或者是因為美工的一時疏忽等原因。策劃設計不完善的地方主要在游戲的參數(shù)部分,參數(shù)不合理會影響游戲的可玩性。所以,測試階段的工作就是檢測程序上的漏洞和調整游戲的各部分參數(shù)使之達到基本平衡。游戲測試人員在發(fā)現(xiàn)BUG以后,要及時向程序組、策劃人員以及美工進行反饋,由他們進行修改。修改完成后,再進行測試,確定問題得到了解決。如此反復進行,直到沒有明顯的問題為止。在進行測試工作時,要盡量把這些問題全部解決,不能留到上市以后讓玩家去發(fā)現(xiàn)。4.2游戲程序基本開發(fā)語言與環(huán)境4.2.1游戲程序基本開發(fā)語言游戲該使用何種語言開發(fā),這是個問題,但是并沒有簡單而唯一的答案。在某些應用程序中,總有一些計算機語言優(yōu)于其他語言。下面是幾種用于編寫游戲的主要編程語言的介紹及其優(yōu)缺點,希望能夠起到一定的借鑒作用。
1.?C語言
C語言是DennisRitchie在20世紀70年代創(chuàng)建的,它功能強大且與ALGOL保持更連續(xù)的繼承性,而ALGOL則是第一代高級編譯語言COBOL和FORTRAN的結構化繼承者。C語言被設計成一個比它的前輩更精巧、更簡單的版本,它適于編寫系系統(tǒng)級的程序,比如操作系統(tǒng)。在此之前,操作系統(tǒng)是使用匯編語言編寫的,而且不可移植。C語言是第一個使得系統(tǒng)級代碼移植成為可能的編程語言。C語言支持結構化編程,也就是說,C語言的程序被編寫成一些分離的函數(shù)調用集合,這些調用自上而下運行,而不像一個單獨的集成塊的代碼使用GOTO語句控制流程。因此,C語言程序比起集成性的FORTRAN及COBOL代碼要簡單得多。事實上,C語言仍然具有GOTO語句,不過它的功能被限制了,僅當結構化方案非常復雜時才建議使用。正由于它的系統(tǒng)編程根源,將C語言和匯編語言進行結合是相當容易的。函數(shù)調用接口非常簡單,而且匯編語言指令還能內嵌到C語言代碼中,所以不需要連接獨立的匯編模塊。使用C語言編寫游戲的優(yōu)點是有益于編寫小而快的程序,很容易與匯編語言結合,具有很高的標準化;缺點是不容易支持面向對象技術,語法有時會非常難以理解,并造成濫用。從移植性方面來說,C語言的核心以及ANSI函數(shù)調用都具有移植性,但僅限于流程控制、內存管理和簡單的文件處理,其他的東西都與平臺有關,比如說,為Windows和Mac開發(fā)可移植的程序,用戶界面部分就需要用到與系統(tǒng)相關的函數(shù)調用,這一般意味著必須寫兩次用戶界面代碼。不過有一些C語言的庫可以幫助減輕工作量。
2.?C++語言
C++語言是具有面向對象(OO,ObjectOriented)特性的C語言的繼承者。面向對象編程(OOP)是結構化編程的下一步。OO程序由對象組成,其中的對象是數(shù)據(jù)和函數(shù)的離散集合。有許多可用的對象庫存在,這使得編程簡單得只需要將一些程序“建筑材料”堆在一起,比如說,有很多的GUI和數(shù)據(jù)庫的庫實現(xiàn)為對象的集合。C++總是辯論的主題,尤其是在游戲開發(fā)論壇里。有幾項C++的功能,比如虛擬函數(shù),為函數(shù)調用的決策制定增加了一個額外層次,批評家很快指出C++程序將變得比相同功能的C程序來得大而慢。C++的擁護者則認為,用C寫出與虛擬函數(shù)等價的代碼同樣會增加開支。這將是一個還在進行,而且不可能很快得出結論的爭論。大多數(shù)人認為,C++的額外開支只是使用更好的語言的較小的付出。同樣的爭論發(fā)生在20世紀60年代高級程序語言如COBOL和FORTRAN開始取代匯編成為語言所選的時候。批評家正確地指出使用高級語言編寫的程序天生就比手寫的匯編語言來得慢,而且必然如此。而高級語言支持者認為這么點小小的性能損失是值得的,因為COBOL和FORTRAN程序更容易編寫和維護。使用C++語言編寫的游戲非常多,事實上,大多數(shù)的商業(yè)游戲都是使用C和C++編寫的。使用C++語言的優(yōu)點是組織大型程序時比C語言好用得多,C++具有很好的支持面向對象機制,使用通用的數(shù)據(jù)結構,如鏈表和可增長的陣列組成的庫減輕了由于處理底層細節(jié)的負擔。其缺點是非常大而復雜,與C語言一樣存在語法濫用問題,比C慢,大多數(shù)編譯器沒有把整個語言正確地實現(xiàn)。從移植性方面來講,C++比C語言好多了,但是仍然不是很樂觀,因為它具有與C語言相同的缺點。大多數(shù)可移植性用戶界面都使用C++對象實現(xiàn)。
3.?C#語言
C#(英文念法是CSharp),是微軟為?.net平臺量身定做的程序語言。C#具備了C/C++的面向對象的功能,并且提供了類似VisualBasic一樣簡易使用的特性,以及微軟新的?.net平臺自動提供記憶體管理與安全性的優(yōu)點。過去講到C#,大多把它當成在?.net平臺上處理商用程序的一種程序語言,很多實際在游戲業(yè)界工作的程序員不把它作為游戲開發(fā)的主要程序語言。因為游戲軟件對效率的需求很高,所以需要的是高效率的C/C++,才能讓游戲軟件充分利用電腦的每一分能力。不過這個傳統(tǒng)的觀念也因為兩個主要的原因而逐步被顛覆了。首先游戲的規(guī)模越做越大,事實上全部的游戲都使用C/C++來開發(fā)是很耗費時間與人力的。而且程序越寫越大后,超過十萬行的C/C++程序到了游戲制作的后期,只要改動一個小地方,可能就要重新編譯一次程序,這個過程是很浪費時間的。C#正是一個在PC上可以使用的簡化程序語言,由于它是C/C++的簡化與改良,所以寫起來更為容易,也較易被習慣C/C++語言的程序員所接受。另一個原因則是PC硬件的進步。在CPU速度越來越快的時代,一款游戲所有的程序模塊已經不需要全部都使用最有效率的C/C++語言開發(fā)。許多游戲處理的邏輯使用像C#、VB這樣在微軟CLR(公共語言運行庫)環(huán)境執(zhí)行虛擬碼的方式是沒有問題的。只要不是屬于極端需要速度的程序代碼,使用C#來開發(fā)并不會造成游戲執(zhí)行速度變慢(至少不會慢到無法忍受)。
4.匯編語言匯編是第一個計算機語言,匯編語言實際上是計算機處理器實際運行指令的命令形式表示法,用匯編語言編寫程序意味著程序員要與處理器的底層打交道,比如寄存器和堆棧。確切地說,任何能在其他語言里做到的事情,匯編都能做,只是不那么簡單。總的來說,匯編語言不會在游戲中單獨應用。游戲使用匯編主要是使用它那些能提高性能的部分。比如說,DOOM整體使用C語言來編寫,但有幾段繪圖程序則使用匯編語言編寫,這些程序每秒鐘要調用數(shù)千次,因此,盡可能地簡潔將有助于提高游戲的性能。而從C里調用匯編語言編寫的函數(shù)是相當簡單的,因此同時使用兩種語言不成問題。匯編的優(yōu)點是它是最小、最快的語言,匯編高手能編寫出比任何其他語言實現(xiàn)起來快得多的程序。匯編語言的缺點就是難學及語法晦澀,由于堅持效率而造成大量額外代碼產生。匯編的移植性接近零,因為這門語言是為一種單獨的處理器設計的,根本沒有移植性可言,如果使用了某個特殊處理器的擴展功能,代碼甚至無法移植到其他同類型的處理器上。
5.?Pascal語言
Pascal語言是由NicolasWirth在20世紀70年代早期設計的,因為他對于FORTRAN和COBOL沒有強制訓練學生的結構化編程感到很失望,Pascal被設計來強行使用結構化編程。最初的Pascal被嚴格設計成教學之用,而大量的擁護者促使它闖入了商業(yè)編程中。當Borland發(fā)布IBMPC上的TurboPascal時,Pascal輝煌一時,集成的編輯器,閃電般的編譯器加上低廉的價格使之變得不可抵抗,Pascal編程成了為MS-DOS編寫小程序的首選語言。然而時隔不久,C編譯器變得更快,并具有優(yōu)秀的內置編輯器和調試器。Pascal在1990年Windows開始流行時走向衰落,Borland放棄了Pascal而把目光轉向了為Windows編寫程序的C++,TurboPascal很快被人遺忘。后來在1996年,Borland發(fā)布了它的“VisualBasicKiller”——Delphi。Delphi是一種快速的帶有華麗用戶界面的Pascal編譯器,它很快贏得了一大群愛好者?;旧希琍ascal比C簡單,雖然語法類似,但它缺乏很多C有的簡潔操作符。這既是好事又是壞事,雖然寫出的代碼易于理解,但同時也使得一些低級操作,如位操作變得困難起來。使用Pascal編寫的游戲并不多。Pascal語言的優(yōu)點就是易學,缺點是面向對象的Pascal繼承者(Modula、Oberon)尚未成功,語言標準不被編譯器開發(fā)者認同。Pascal的移植性很差,語言的功能由于平臺的轉變而轉變,沒有移植性工具包來處理平臺相關的功能。
6.?VisualBASIC(VB)語言
20世紀80年代是BASIC的時代,它幾乎是所有程序初學者學習的第一個語言。最初的BASIC形式雖然易于學習,卻是無組織化的,它義無反顧地使用了GOTO充斥的代碼。當回憶起B(yǎng)ASIC的行號和GOSUB命令,仍然令人為之嘆息。到了20世紀90年代早期,微軟取得了一個小巧的名為Thunder編程環(huán)境的許可權,并把它作為VisualBASIC1.0發(fā)布,其用戶界面在當時非常具有新意。這門語言雖然還叫做BASIC,但更加結構化,行號也被去除。實際上,這門語言與那些內置于TRS-80、AppleII及Atari里的舊的ROMBASIC相比,更像是帶BASIC風格動作的Pascal。經過6個版本的發(fā)展,VisualBASIC變得非常漂亮,用戶界面發(fā)生了許多變化,但仍然保留著“把代碼關聯(lián)到用戶界面”的主旨,這使得它在與即時編譯結合時變成了一個快速、原型的優(yōu)異環(huán)境。使用VisualBASIC編寫的游戲有一些是共享的,還有一些是商業(yè)性的。使用VB的優(yōu)點是具有整潔的編輯環(huán)境、易學、可即時編譯;缺點是程序很大,而且運行時需要幾個巨大的運行時動態(tài)鏈接庫。雖然表單型和對話框型的程序可很容易地完成,但要編寫好的圖形程序卻比較難。VB調用Windows的API程序非常笨拙,因為它的數(shù)據(jù)結構沒能很好地映射到C中。VB有OO功能,但卻不是完全的面向對象。在移植性方面,因為VisualBASIC是微軟的產品,自然就被局限在實現(xiàn)它的平臺上,其移植性表現(xiàn)得非常差。也就是說,唯一的選擇就是Windows。當然,現(xiàn)在已有一些工具能將VB程序轉變成Java程序。
7.?Java語言
Java是由Sun公司最初設計用于嵌入程序的可移植性“小C++”。在網(wǎng)頁上運行小程序的想法著實吸引了不少人的目光,于是,這門語言迅速崛起。事實證明,Java不僅僅適于在網(wǎng)頁上內嵌動畫,它還是一門極好的完全的軟件編程的小語言。“虛擬機”機制、垃圾回收以及沒有指針等使它很容易實現(xiàn),成為不易崩潰且不會泄漏資源的可靠程序。Java從C++中借用了大量的語法,也丟棄了很多C++的復雜功能,從而形成了一門緊湊而易學的語言。與C++不同的是,Java是強制面向對象編程的,要在Java里寫非面向對象的程序是非常困難的。使用Java的優(yōu)點是二進制碼可移植到其他平臺,程序可以在網(wǎng)頁中運行,內含的類庫非常標準且極其健壯,自動分配和垃圾回收功能可以避免程序中的資源泄漏,在網(wǎng)上還可以找到數(shù)量巨大的代碼例程。缺點是使用一個“虛擬機”來運行可移植的字節(jié)碼而非本地機器碼,程序將比真正編譯器慢。有很多技術(例如“即時”編譯器)極大地提高了Java的速度,但速度還是比不過機器碼方案。綜上所述,C語言適于編寫快而小的程序,但不支持面向對象的編程。C++完全支持面向對象,但是非常復雜。VisualBASIC與Delphi易學,但不可移植且有專利權。Java有很多簡潔的功能,但是速度慢。4.2.2游戲程序的開發(fā)環(huán)境針對游戲本身最基礎的圖形等技術,如果沒有一套完善的開發(fā)環(huán)境,就必須要自己通過代碼編寫架起一套與計算機能夠溝通的橋梁,對于一個游戲設計者來說,這是一件既花時間、又費精力的工作。因此在計算機硬件與游戲程序代碼之間可以加入圖形API作為橋梁,一來解決自行開發(fā)溝通工具的困難,二來圖形API都由較底層的方式構成,處理速度也比較快。
API的出臺使得游戲開發(fā)者的工作更加輕松、容易。應用程序接口API(ApplicationProgrammingInterface)是連接應用程序、操作系統(tǒng)和底層硬件的紐帶。通俗點說,API就是軟件函數(shù)(接口)的集合,這些預先編寫好的函數(shù)可以對硬件進行直接控制,它最大的優(yōu)點就是通用性和方便性。目前可接觸到的圖形API分為OpenGL和DirectX兩大體系。前者是一項開放性的標準,主攻專業(yè)圖形應用和3D游戲,由“OpenGL架構委員會”掌控,其成員包括業(yè)內各大廠商,目前主要推動標準發(fā)展的實際領導者是3Dlabs。DirectX則是微軟制定的API標準,除了圖形API功能外,它還包含音頻API等功能,只不過其圖形部分升級最快,也最為人所知。DirectX針對的主要是娛樂應用,目前最新的DirectX10API功能極為強勁。
1.?OpenGL
OpenGLAPI開始是由SGI為開發(fā)2D和3D圖形應用提出的,它是一個跨平臺的,與銷售商無關的API。OpenGLAPI是一個只用于圖形、跨平臺和對供應商中立的API,計劃使用C和C++程序語言,但是也捆綁了大量其他程序語言,如Java和FORTRAN。OpenGL廣泛應用于信息可視化、虛擬現(xiàn)實、可視化科學、計算機輔助設計(CAD)和游戲開發(fā)。當OpenGL在處理繪圖數(shù)據(jù)時,它會將數(shù)據(jù)填滿整個緩沖區(qū),而這個緩沖區(qū)內的數(shù)據(jù)包含指令、坐標點、材質信息等,在由指令控制或緩沖區(qū)被清空(Flush)的時候,將數(shù)據(jù)送往下一個階段去進行處理。在下一個處理階段,OpenGL會進行坐標轉換與燈光(Transform&Lighting)的運算,其目的是計算物體實際成像的幾何坐標點與光影位置。在完成上述處理過程之后,其數(shù)據(jù)會被送往下一個階段。在這個階段中,其主要的工作是將計算出的坐標數(shù)據(jù)、顏色與材質數(shù)據(jù)經過掃描顯像(rasterization)的技術來建立一個影像,然后影像再被送至繪圖顯示裝置(FrameBuffer)的內存中,最后才由繪圖顯示裝置將影像呈現(xiàn)于屏幕上,如圖4-1所示。圖4-1OpenGL基本工作流程
2.?DirectX
DirectX是一種Windows系統(tǒng)的API,它可以讓以Windows為操作平臺的游戲或多媒體程序獲得更高的執(zhí)行效率,而且還可以加強3D圖形成像和豐富的聲音效果,另外提供給設計人員一個共同的硬件驅動標準,讓游戲開發(fā)者不必為每一個廠商的硬件設備編寫不同的驅動程序,同時也降低了使用者安裝及設置硬件的復雜度。當DirectX初始化后,它會校驗硬件是否支持應用需要的某個功能。如果硬件支持這個功能,則使用硬件抽象層HAL(TheHardwareAbstractionLayer)來訪問硬件功能;否則將使用硬件模擬層HEL(TheHardwareEmulationLayer),用軟件來模擬這個功能。Direct3D與硬件之間的關系如圖4-2所示。圖4-2Direct3D與硬件之間的關系
DirectX的各類組件如下:
(1)?DirectXGraphics:包含兩個API,DirectDraw用于繪制光柵圖形,Direct3D(D3D)用于繪制3D初始圖形。
(2)?DirectInput:用于處理從鍵盤、鼠標、操縱桿以及其它游戲控制器發(fā)出的數(shù)據(jù)。
(3)?DirectPlay:用于游戲網(wǎng)絡通信。
(4)?DirectSound:用于記錄和回放聲音波形。
(5)?DirectSound3D:用于3D聲音回放。
(6)?DirectMusic:用于回放DirectMusicProducer中創(chuàng)作的聲道。
(7)?AudioVideoPlayback:用于播放視頻和音頻。
(8)?DirectSetup:用于安裝DirectX組件。
(9)?DirectXMedia:由DirectAnimation,DirectXTransform和動畫DirectShow,交互DirectShow,流媒體應用DirectShow組成。
(10)?DirectXMediaObjects:用于對流對象提供支持,例如編碼器、解碼器和效果。
DirectX的API按照性質不同可以分為四大部分:顯示部分、聲音部分、輸入部分和網(wǎng)絡部分。顯示部分擔任圖形處理的關鍵,分為DirectDraw(DDraw)和Direct3D(D3D),前者主要負責2D圖像加速,它包括很多方面:播放DVD電影、看圖、玩2D小游戲等,都是用的DDraw。后者則主要負責3D效果的顯示,比如CS中的場景和人物、FIFA中的人物等,都是使用了DirectX的Direct3D。聲音部分中最主要的API是DirectSound,除了播放聲音和處理混音之外,還加強了3D音效,并提供了錄音功能。輸入部分的DirectInput可以支持很多的游戲輸入設備,它能夠讓這些設備充分發(fā)揮最佳狀態(tài)和全部功能。除了鍵盤和鼠標之外還可以連接手柄、搖桿、模擬器等。網(wǎng)絡部分的DirectPlay主要就是為了具有網(wǎng)絡功能的游戲而開發(fā)的,提供了多種連接方式,TPC/IP,IPX,Modem,串口等,讓玩家可以用各種聯(lián)網(wǎng)方式來進行對戰(zhàn),此外也提供網(wǎng)絡對話功能及保密措施。有了這些API可以大大降低程序員的工作量與工作難度。然而由于3D描繪的技術更新越來越快,使得游戲的開發(fā)難度日漸升高,因此將常用的部分慢慢地抽離出來以提高重用性是一個降低開發(fā)成本的好方法,這些模塊集合起來之后便形成3D游戲引擎的雛形。3D游戲引擎的優(yōu)點就在于提供穩(wěn)定的游戲開發(fā)平臺、最新的動畫或繪圖功能、與游戲引擎互相搭配的游戲制作工具及跨平臺等強大功能,因此利用3D游戲引擎來開發(fā)游戲已經成為一股新的游戲開發(fā)趨勢。4.3游戲基礎編程技術4.3.1樣板游戲程序分析
樣板程序一:《益智棋》我們來看一個很小的游戲:《益智棋》,在這個游戲中,玩家和計算機玩一個井字游戲,進行人與計算機的對戰(zhàn)。計算機使用人工智能進行控制。程序開發(fā)最重要的部分就是程序的設計。在程序員編寫任何游戲代碼之前,游戲設計人員都需要在書面概念、設計文檔以及原型上花費大量的時間。在設計工作完成之后,程序員開始他們的工作,這需要更多的規(guī)劃。只有在程序員編寫了自己的技術性設計之后,他們才真正開始編寫代碼。設計非常重要!撕掉一張圖紙比拆掉一幢50層大樓要容易得多。
1.編寫偽代碼偽代碼并不是一種真正可執(zhí)行的程序代碼。因為對于程序中的大多數(shù)任務,都將使用函數(shù)實現(xiàn),所以可以在非常抽象的級別上考慮這些代碼。偽代碼中的每一行都應該與一個函數(shù)調用非常相似。在這之后所要做的一切就是編寫偽代碼中所指出的函數(shù)。下面是偽代碼:
CreateanemptyTic-Tac-Toeboard
Displaythegameinstructions
Determinewhogoesfirst
Displaytheboard
Whilenobody’swonandit’snotatie
Ifit’sthehuman’sturn
Getthehuman’smove
Updatetheboardwiththehuman’smove
Otherwise
Calculatethecomputer’smove
Updatetheboardwiththecomputer’smove
Displaytheboard
Switchturns
Congratulatethewinnerordeclareatie
2.表示數(shù)據(jù)現(xiàn)在已經制定好了計劃,但是它相當抽象,討論的是人們頭腦中還沒有真正確定的各種不同元素。在游戲棋盤上放一個棋子就表示走了一步。但是,究竟應該怎樣表示游戲棋盤、棋子以及一次走棋呢?要在屏幕上顯示游戲棋盤,可以將一個棋子表示為一個單獨的字符(‘X’或‘O’),一個空白的棋子就是一個空格。因此,這個棋盤本身就是一個字符(char)數(shù)組。由于井字游戲棋盤上包括9個方塊,因此這個數(shù)組應該包括9個元素。棋盤上的每一個方塊都對應于該數(shù)組中的一個元素,如圖4-3所示。圖4-3游戲棋盤示意圖棋盤上的每一個方塊或位置都是由0~8之間的一個數(shù)字表示的,對應著數(shù)組中的9個元素。每一次走棋就是在一個方塊中放置一個棋子,所以一次走棋也就對應著0~8之間的一個數(shù)字。因此,可以將走棋定義為一個整型(int)變量。正如游戲棋子一樣,玩家和計算機雙方也可以表示為字符(char)(‘X’或‘O’)類型。
3.創(chuàng)建函數(shù)列表偽代碼提示了所需要的不同函數(shù)。創(chuàng)建一個函數(shù)列表,說明每個函數(shù)的作用、需要包括的參數(shù)以及將要返回的值,如表4-1所示。此程序源代碼詳見附錄B。表4-1函數(shù)列表
樣板程序二:《星球大戰(zhàn)》
1.游戲簡介
《星球大戰(zhàn)》是關于太空入侵者的競技類游戲。在《星球大戰(zhàn)》中,玩家控制代表人類的戰(zhàn)艦在屏幕底部移動,戰(zhàn)艦上配有激光炮作為武器。外星人聯(lián)軍在屏幕上方來回移動,向下投射炸彈,在屏幕頂部逐漸移動到屏幕下半?yún)^(qū)域。玩家的激光炮有無限的彈藥,玩家不僅要朝著外星人開火以摧毀他們,同時也要躲避外星人投下來的炸彈。
2.游戲規(guī)則
(1)避免戰(zhàn)艦被外星人射出的炸彈射中。
(2)使用激光炮朝著移動的外星人軍隊開火,打擊外星人。
(3)通過反復摧毀外星人的軍隊,獲得盡可能高的點數(shù)。
3.游戲設計
(1)《星球大戰(zhàn)》是單人游戲。玩家的對手是計算機,計算機控制外星人軍隊的移動和攻擊。
(2)游戲開始時,出現(xiàn)一個持續(xù)3秒鐘的閃屏(Splash),顯示背景圖形和游戲名稱。閃屏在保持3秒之后,被主菜單畫面所替換。
(3)主菜單有3個選項:“PLAYGAME”、“HELP”和“EXIT”。玩家可以使用上下箭頭鍵和Enter鍵選擇特定菜單項。主菜單中還使用了UFO動畫來突出所選選項。如果菜單項被選中,UFO呈現(xiàn)爆炸動畫。
(4)“PLAYGAME”選項用來開始游戲?!癏ELP”選項顯示游戲的玩法和規(guī)則。“EXIT”選項退出游戲并關閉游戲窗口。
(5)選擇“HELP”選項,幫助畫面會出現(xiàn)并顯示10秒,之后返回到主菜單。
(6)選擇“PLAYGAME”選項時,第一個游戲屏幕將顯示就緒狀態(tài)。此屏幕包含60個外星人,共6行,每行10個,每行外星人的顏色和特征不同。戰(zhàn)艦位于游戲窗口底部中間,激光炮位于戰(zhàn)艦頂部。通過使用左右箭頭鍵,可以左右移動戰(zhàn)艦。游戲窗口的底部顯示了游戲的統(tǒng)計信息,如玩家剩余的生命數(shù)、正在玩的關卡以及當前的積分。
(7)當玩家按下空格鍵時,激光炮發(fā)出炮彈,游戲開始。
(8)按下空格鍵向上垂直發(fā)射炮彈,炮彈發(fā)出后不能隨著戰(zhàn)艦左右移動,并在其到達游戲窗口的頂邊時消失。
(9)如果炮彈擊中外星人軍隊中的任意一個外星人,則該外星人圖像爆炸且玩家贏得消滅對方的獎勵點數(shù)。
(10)消滅不同類型的外星人有不同的獎勵點數(shù)。消滅最下面一排的每個外星人的積分值為10點,向上每行遞增10點。消滅最上面一排的一名外星人可獲得60點積分。
(11)隨著關數(shù)的增加,外星人軍隊發(fā)出的炮彈數(shù)也會增加,這增加了游戲的難度。如果外星人發(fā)出的炮彈撞到戰(zhàn)艦,則戰(zhàn)艦會爆炸,同時玩家的生命值減1,整個外星人軍隊重置,并用剩余的生命數(shù)重新開始相同的關卡。玩家的初始生命值為3。
(12)如果生命值減到0,則游戲結束,玩家可以重新開始玩游戲或退出游戲。幾種狀態(tài)下的游戲截圖如圖4-4所示。圖4-4游戲截圖
4.程序介紹
1)初始化DirectX圖形
(1)創(chuàng)建圖形設備;
(2)設置設備的協(xié)作級別;
(3)創(chuàng)建主平面和次平面;
(4)為主平面創(chuàng)建剪切;
(5)將內容從次平面轉換到主平面。
2)構建基本游戲循環(huán)在游戲中,玩家可以通過輸入設備提供輸入信息,控制游戲角色以使其表現(xiàn)出某種行為,而有些角色是由游戲智能控制的。游戲控制的角色與玩家控制的角色必須能夠同時行動,以使他們之間的行為協(xié)調一致。這種一致是通過游戲循環(huán)來實現(xiàn)的。游戲循環(huán)執(zhí)行一次稱作一幀,每一幀都可以完成與圖像、物理和游戲智能相關的一組活動。游戲循環(huán)通過不斷地改變畫面幀實現(xiàn)動畫,當其執(zhí)行的速度達到60fps時,就會得到一個動態(tài)的游戲了。在游戲循環(huán)中處理的事件有:
(1)利用游戲循環(huán)與鍵盤移動角色;
(2)使用定時器控制角色的速度與行為;
(3)檢測角色之間的碰撞。
3)游戲中動畫的實現(xiàn)動畫是一種運動的幻覺,根據(jù)圖像文件類型的不同通常有兩種方法來創(chuàng)建動畫。
(1)多文件方法:在多文件方法中,動畫圖像存儲在不同的文件中,如圖4-5所示,程序以正確的次序依次顯示各個圖像文件,實現(xiàn)動畫的顯示。圖4-5多文件方法創(chuàng)建動畫
(2)單文件方法:在單文件方法中,動畫圖像存儲在同一個文件中,如圖4-6所示,程序需要從圖像文件中截取相應的部分,使用正確的順序依次顯示每一部分,實現(xiàn)動畫的顯示。
4)在游戲中播放音頻和視頻
(1)將播放各種音頻和視頻需要的各種DirectXAPI添加到工程中;
(2)利用AudioVideoPlaybackAPI播放音頻和視頻文件;
(3)利用DirectSound播放音頻。圖4-6單文件方法創(chuàng)建動畫樣板程序三:手機游戲《拯救美人魚》
1.游戲簡介浩瀚的大海中住著一群可愛、活潑的美人魚,蔚藍的大海是她們幸福、快樂的家。然而有一天這一片海域被一個女巫占據(jù)了,她嫉妒美人魚的美麗,她的咒語讓海水發(fā)生了變化,美人魚難以在這片海域再生存下去。玩家控制一艘救援船尋找需要救援的美人魚,并將帶她們駛往另一片純凈的海域。游戲的目的就是盡可能多地拯救美人魚。在前進途中會有浮冰和鯊魚來增加營救任務的難度。游戲中,船的燃料有限,而且每次碰到浮冰和鯊魚,燃料就會減少。當然,也可以通過拾取漂浮的汽油桶來補充燃料。當救援船消耗完所有的燃料后,船就會失去前進的動力,游戲就結束了。
2.游戲設計游戲的運行界面如圖4-7所示。此游戲中包含2個美人魚、2個汽油桶、3塊浮冰和3個鯊魚。注意:這里“消極”的精靈(sprite)(浮冰和鯊魚)要比“積極”的精靈(美人魚和汽油桶)多。保證消極的精靈多于積極的精靈,這種傾向是必要的,它能夠確保玩家最終會失敗而不是永遠地玩下去或者直到產生厭倦。游戲需要8個位圖圖像:信息欄圖像、帶有水域貼圖的背景圖像、帶有陸地貼圖的背景圖像、救援船精靈圖像、美人魚精靈圖像、汽油桶精靈圖像、浮冰精靈圖像和鯊魚精靈圖像。部分游戲精靈圖像如圖4-8所示。圖4-7《拯救美人魚》運行界面圖4-8游戲中的精靈圖像除了游戲中的大多數(shù)圖形對象,還需要考慮以下游戲必須維護的其他數(shù)據(jù)。比如跟蹤救援船剩下了多少能量,游戲“分數(shù)”(也就是有多少美人魚已經被救起來),還需要一個Boolean變量來表示游戲是否結束。概括一下,《拯救美人魚》游戲需要管理下面的一些信息:
(1)救援船剩下多少能量;
(2)分數(shù),也就是救起來的美人魚的數(shù)目;
(3)一個表示游戲結束的Boolean變量。
3.游戲開發(fā)
1)創(chuàng)建一個漂移精靈精靈漂移的功能由DriftSprite類來實現(xiàn),這個類的功能相當簡單,只是以固定的速度隨機移動。對象以較低的速度移動看上去才像是漂移,而較高速度的對象看上去像是在自主移動。另外,這種功能能滿足需要,因為游戲中的美人魚、汽油桶和浮冰精靈都需要看上去是在漂移,而鯊魚則可以移動的稍快一點,因為它可以自己游動。
DriftSprite類只需要兩個成員變量來執(zhí)行漂移功能:
privateintspeed;
privateTiledLayerbarrier;變量speed就是精靈的速度,它按照每個游戲循環(huán)多少像素來衡量。一般來講,如果希望看到精靈漂移,速度值為1或2時比較合適,較高的值就會看起來像是在自主地移動了。變量barrier則是一個平鋪圖層,它用作精靈的障礙。之所以需要這個變量是因為在很多游戲中都需要一個平鋪圖層來作為大多數(shù)精靈的障礙。這個圖層可以是迷宮、停機坪或者只是地面,但是大多數(shù)的游戲都會用到這樣一個障礙物圖層。
DriftSprite中的兩個成員變量都在DriftSprite()構造函數(shù)中初始化。
DriftSprite類中的update()方法按照隨機的方向移動精靈,并檢測它和障礙物圖層之間的沖突。
2)聲明成員變量毫無疑問,《拯救美人魚》游戲首先從一個定制的畫布類HSCanvas開始。HSCanvas類負責《拯救美人魚》游戲中的所有游戲邏輯。下面是定義在《拯救美人魚》定制的畫布類中的最重要的成員變量:
privateLayerManager layers;
privateint xView,yView;
privateTiledLayer waterLayer;
privateTiledLayer landLayer;
privateint waterDelay;
privateint[] waterTile={1,3};
privateImage infoBar;
privateSprite playerSprite;
privateDriftSprite[] pirateSprite=newDriftSprite[2];
privateDriftSprite[] barrelSprite=newDriftSprite[2];
privateDriftSprite[] mineSprite=newDriftSprite[5];
privateDriftSprite[] squidSprite=newDriftSprite[5];
privatePlayer musicPlayer;
privatePlayer rescuePlayer;
privatePlayer minePlayer;
privatePlayer gameoverPlayer;
privateboolean gameOver;
privateint energy,piratesSaved;前幾個變量用來存儲圖層管理器、視圖窗口位置、水域圖層和陸地圖層。變量waterDelay和waterTile負責實現(xiàn)水域圖層中的水域動畫效果。變量infoBar保存的位圖圖像在屏幕頂部用做玩家能量和救起的美人魚數(shù)目的背景。然后,創(chuàng)建了幾個精靈,包括玩家的救援船精靈,一對美人魚精靈和一對汽油桶精靈,3個浮冰精靈和3個鯊魚精靈。在整個游戲中沒有再創(chuàng)建其他的精靈,而是簡單地重用精靈,給人造成的錯覺則好像是游戲中有更多的精靈。接下來,游戲的聲音效果和音樂借助不同的Player變量播放。最后,游戲的狀態(tài)通過變量gameOver、energy和piratesSaved反映出來。
3)組合start()方法和update()方法
《拯救美人魚》游戲中的start()方法有很多職責,它負責處理所有和游戲相關的初始化工作。update()方法在每個游戲循環(huán)中調用一次,并且負責更新精靈和圖層、檢測沖突和保持游戲運行。在《拯救美人魚》中,update()方法開始先檢查看游戲是否結束,如果結束了,它會開始一個新的游戲作為對用戶按下Fire按鍵的響應。
privatevoidupdate(){
//Checktoseewhetherthegameisbeingrestarted
if(gameOver){
intkeyState=getKeyStates();
if((keyState&FIRE_PRESSED)!=0)
//Startanewgame
newGame();
//Thegameisover,sodon'tupdateanything
return;
}開始一個新游戲只需要簡單調用newGame()方法,調用之后,update()立即返回,因為在這個特定的游戲循環(huán)中,沒有理由再繼續(xù)更新一個新開始的游戲。
4)繪制游戲屏幕借助圖層管理器在《拯救美人魚》中繪制游戲屏幕比較直接。HSCanvas類中的draw()方法代碼的第一段負責繪制信息欄,信息欄包括一個位圖以及覆蓋在位圖上的一個能量條和獲救海盜的數(shù)目。能量條通過調用fillRect()方法來繪制,并且所有的文本都會在drawstring()方法中繪制。Draw()方法的中部通過一行代碼來繪制圖層,接下來繪制游戲結束消息。如果游戲結束了,就繪制游戲結束消息,其中包含“GAMEOVER”的字樣,接著顯示有多少個海盜被救起,這相當于游戲的分數(shù)。
5)安全地放置精靈
placeSprite()方法負責在游戲地圖上隨機地放置精靈。要隨機地把精靈放置到游戲地圖上的一個“安全”位置,只需要隨機放置精靈并且檢測它和陸地圖層之間的沖突。如果有沖突,就重新嘗試。放置/嘗試的過程形成循環(huán),這樣就能重復進行直到能夠找到一個成功的位置。此程序源代碼詳見附錄C。4.3.2基本編程技術所謂程序,就是一組計算機系統(tǒng)能識別和執(zhí)行的指令。每一條指令可以使計算機實現(xiàn)特定的任務、完成相應的操作。計算機程序就是一條條可以連續(xù)執(zhí)行、并能完成一定任務的指令的集合。使用適當?shù)闹噶睿梢詫崿F(xiàn)所設計的游戲,否則,就是亂碼。由于計算機只能識別與執(zhí)行由0和1組成的二進制指令,所以在計算機誕生初期,人們必須用機器語言編寫程序,那時只有極少數(shù)計算機專家才能熟練地使用計算機。隨著計算機技術的推廣應用,編程語言也得到了迅猛發(fā)展,先后出現(xiàn)了多種接近自然語言的高級計算機語言,目前在游戲編程方面使用最多的是C++。使用編程語言,可以通過編寫語句來控制計算機的所有部件,比如顯示器、聲卡、鼠標、鍵盤及其他外部設備。使用編程語言,可以在屏幕上顯示外星人入侵的星球大戰(zhàn),還可以播放音樂,添加音效。要成為一名游戲開發(fā)程序員,必須掌握一門高效、好用的編程語言。用高級語言編寫的程序稱為“源程序”。為了使計算機能執(zhí)行高級語言源程序,必須先用一種稱為“編譯程序”的軟件,把“源程序”翻譯成二進制的“目標代碼”,然后再將該目標程序與系統(tǒng)的函數(shù)庫以及其他目標程序連接起來,形成可以執(zhí)行的“可執(zhí)行代碼”。本文以C++?語言為例來解釋這一過程。C++程序的這一編寫及運行過程可以歸納為四個階段:編輯、編譯、連接、運行。編輯,指運用C++語言編寫以“.cpp”為擴展名的源代碼文件。計算機不能直接執(zhí)行源代碼,只有經過編譯、連接轉換成二進制語言后才可以執(zhí)行。編譯,指將編輯好的源代碼文件編譯成以“.obj”為擴展名的目標代碼文件。目標代碼是可重定位的程序模塊,它不能直接運行。一個源程序文件由一個或多個函數(shù)組成,一個源程序文件是一個編譯單位,在編譯過程中,編譯程序首先要對源程序中的每一個語句進行語法和簡單的語義錯誤檢查,當發(fā)現(xiàn)錯誤時,便顯示錯誤提示。連接,指把目標文件和其他編譯生成的目標代碼及系統(tǒng)提供的標準庫函數(shù)連接在一起,生成以“.exe”為擴展名的可執(zhí)行文件。運行,指可執(zhí)行文件在操作系統(tǒng)下執(zhí)行。如果執(zhí)行程序后沒有達到預期目的,則需要調試,并重復進行編輯、編譯、連接、運行,直到取得預期結果為止。4.3.32D圖形的程序控制在開始進行游戲編程的時候,需要了解一些計算機圖形圖像如何操作的基本概念。在游戲中顯示圖形的工具是顯示器(也稱做屏幕或監(jiān)示器)。顯示器上顯示的圖形稱為位圖圖像、像素圖或光柵圖形。一個光柵圖形是由許多像素點組成的矩陣畫面,這些像素點對應幀緩沖器中的位平面。這些“像素”其實就是一些整齊排列的彩色(或黑白)點,如果這些點被慢慢放大,就會看到一個個的“像素”中填充著自己的顏色,這些“像素”整齊地排列起來,就成為了一幅位圖圖片。圖像文件格式各式各樣,主要有BMP、GIF、JPEG、TIF等。各種格式之間的數(shù)據(jù)存儲格式、數(shù)據(jù)壓縮方法都不同。圖4-9所示是一個正在生氣的外星人“可可”的照片,如果這個圖片保存在計算機中,它被保存為位圖格式,而所有的位圖圖片都是矩陣排列的。但是,游戲中可能只需要顯示外星人“可可”,而不需要顯示位圖圖像的背景,那么就需要把該圖片中表示“可可”的像素點和屏幕中的所有其他圖形結合起來一起顯示,而不顯示位圖圖像的背景部分的像素點。為了只顯示“可可”而不顯示背景像素點,游戲必須使圖像的背景像素點變?yōu)橥该魃@可以通過使用開放式圖形庫(OpenGL)和游戲引擎來處理。在將一張圖片添加到游戲中時,需要告訴游戲引擎哪一種顏色是背景色,圖形庫和引擎就會只顯示圖像內容而不顯示背景色。圖4-9正在生氣的外星人“可可”4.3.42D動畫的程序控制如果游戲中沒有動畫,會降低游戲的好玩性。如果想讓圖4-9中的外星人“可可”動起來,就需要使用電影和動畫中使用的技術。電影最重要的原理是“視覺暫留”。科學實驗證明,人眼在某個視像消失后,仍可使該物像在視網(wǎng)膜上滯留0.1~0.4s。電影膠片以每秒24格畫面勻速轉動,一系列靜態(tài)畫面就會因視覺暫留作用而造成一種連續(xù)的視覺印象,產生逼真的動感。膠片上的每一幅畫面就稱為一幀,每幀之中的畫面只有很輕微的變化。實際上,游戲程序所做的就是用每一幀渲染計算機內存的一塊區(qū)域,這塊區(qū)域叫緩存。大多數(shù)圖形硬件同時支持前、后緩存。顯示器上顯示的是前緩存中的圖像,當游戲應用程序顯示前緩存(可見的)的時候同時將下一幀內容渲染到后緩存。當渲染結束的時候,這兩個緩存進行交換,這樣已經完成渲染的后緩存就變成了前緩存進行顯示,而原來的前緩存就變成了后緩存,渲染就能在后緩存重新開始了。如此不斷進行,就形成了動畫。以圖4-10為例來描述幀動畫的形成過程。圖4-10顯示了兩行圖片,標為前緩存的圖片是當前屏幕上正在顯示的幀,第一行中左邊的圖片是前緩存中的圖像,在顯示它的時候游戲同時將下一張圖片渲染到后緩存。渲染結束后,游戲程序的兩個緩存進行切換,如第二行所示。前緩存和后緩存進行了切換,原來的后緩存變成前緩存進行顯示,同時游戲程序開始在左邊的后緩存中渲染游戲人物的下一個動作。渲染結束后,緩存再進行切換,人物看起來就有了小幅移動。在游戲里實現(xiàn)這個動畫并不困難,所有代碼所要做的就是畫每一幀,其余的事情交由圖形庫和游戲引擎實現(xiàn)。圖4-10在前、后緩存中交換動畫的幀4.3.5游戲界面的程序設計游戲人機界面是玩家和游戲間的聯(lián)系紐帶,人必須通過人機界面控制計算機軟硬件系統(tǒng)提供的功能,并從中獲得所需要的信息反饋。好的人機界面美觀大方,操作簡單,可以使軟件的用戶倍感愉悅。一款成功的軟件必是以成功的用戶界面為前提的,因此,在游戲設計中更需要關注游戲的用戶界面設計。人機界面的硬件部分包括鍵盤、鼠標、游戲手柄、麥克風、數(shù)據(jù)手套和Web攝像機等,這些設備負責將用戶的命令傳送到計算機中。人機界面的軟件部分包括屏幕上的窗口、視頻、圖像、文字、圖標和對鍵盤、鼠標、游戲手柄、數(shù)據(jù)手套的反饋等。對于游戲程序員而言,人機界面設計側重于軟件方面,即在系統(tǒng)的軟硬件環(huán)境下,定義和設計游戲的外觀、交互手段與使用規(guī)則,達到和諧的人際環(huán)境,給予玩家真正的可玩性體驗。人機界面不是一個獨立的開發(fā)過程,它總是與要開發(fā)的軟件結合在一起的。在開發(fā)一款游戲時,不僅要致力于實現(xiàn)游戲的基本功能,還要設計游戲的人機界面。為了保證質量,保證玩家通過界面成功地開始游戲,一個復雜的人機界面必須遵循一定的方法和流程。下面介紹在一般的游戲界面設計中,設計人員應該遵守的幾個原則和開發(fā)過程。
1.人機界面設計原則
1)界面人性化操作界面就是介于游戲和玩家之間的溝通渠道,它越人性化,玩家就越容易理解;反之界面越生硬,玩家需要對其進行的額外思考就越多,使操作變得非常繁瑣。這種人性化還表現(xiàn)在對操作的智能簡化方面,比如在游戲中如果玩家選擇的是一個戰(zhàn)士,那么下一步操作可能就是訓練或戰(zhàn)斗;如果選擇的是一個農夫,那么對應的操作就是種地等。在游戲中不應出現(xiàn)當前不需要用到的指令,這樣就使得整個界面更為清晰和干凈。將界面設計得簡明扼要,玩家就會很容易掌握如何根據(jù)界面進行操作。
2)避免游戲界面干擾游戲顯示區(qū)域一般來講,可以將游戲界面盡量放在游戲屏幕的邊角位置,以避免干擾正常的游戲顯示區(qū)域。在有些情況下,游戲世界需要出現(xiàn)一些類似于對話框的信息,例如游戲中的對話。如果游戲操作界面中沒有安排對話框出現(xiàn)的位置,那么它們一般會在屏幕中心顯示,這樣就會對游戲本身進行遮擋,從而影響顯示效果(見圖4-11)。因此如果游戲中含有大量的對話信息,最好還是給對話在游戲操作界面上留出相應的空間,以避免干擾正常的游戲顯示區(qū)域(見圖4-12)。圖4-11游戲中對話遮擋了游戲顯示區(qū)域圖4-12游戲對話避免干擾游戲顯示區(qū)域
3)簡化控制模式在PC游戲中,一般可以采用鍵盤和鼠標進行操作,或者使用二者的組合,但對于玩家來講,過于復雜的操作環(huán)境不但容易令玩家感到困擾,而且復雜的鍵盤配置還容易產生記憶困難。因而在設計人機界面時,應該讓計算機更積極主動、更勤勞,做更多的工作,而讓玩家盡可能少做操作,能更輕松、更方便地玩游戲。
2.人機界面的軟件開發(fā)過程
1)調查研究判斷一個游戲的優(yōu)劣,在很大的程度上取決于未來玩家的使用評價。因此,在游戲開發(fā)的最初階段,尤其要重視游戲人機界面部分的用戶需求,必須盡可能廣泛地向游戲未來的各類潛在玩家進行調查研究。調查研究的手段一般有兩種:一是通過收集玩家的相關資料,根據(jù)收集來的資料做進一步的分析,并把分析結果用來指導人機界面的設計;二是觀摩研究其他相類似游戲的人機界面的設計,進而獲得啟發(fā)。
2)基本概念設計在調查研究之后,游戲設計者可以自由地發(fā)揮想象力和創(chuàng)造力來進行人機界面的概念設計,設計內容包括基本的功能結構(這些界面能實現(xiàn)什么功能,它們之間有什么樣的聯(lián)系)、信息結構(需要顯示什么信息,哪些信息需要放在主界面中顯示,哪些信息可以放在次要界面中顯示)、屏幕顯示和布局設計(什么地方顯示游戲世界,什么地方顯示人機界面)、輸入輸出設備的利用等,通常在概念設計階段,設計者會把這些想法以圖表的形式表達出來。
3)生成界面原型在經過基本概念設計后,開發(fā)人員用較短時間、較低代價開發(fā)出一個滿足設計基本要求的簡單的可運行系統(tǒng)。該系統(tǒng)可以演示人機界面基本功能或提供給玩家試用,讓玩家進行評價并提出改進意見,進一步完善人機界面的設計。
4)界面測試和評估開發(fā)完成的游戲界面必須經過嚴格的測試和評估。評估可以使用分析方法、實驗方法、玩家反饋以及專家分析等方法。可以對界面客觀性能進行測試(如功能件、可靠性、效率等),或者按照玩家的反饋進行評估,以便盡早發(fā)現(xiàn)問題,改進和完善設計。
5)反復優(yōu)化通過界面測試和評估,設計人員就可以發(fā)現(xiàn)設計上存在的問題,在發(fā)現(xiàn)問題后進行分析并解決,而后繼續(xù)測試,通過反復地測試與優(yōu)化,最終得到滿意的結果。4.4游戲高級編程技術4.4.1網(wǎng)絡游戲的軟件體系結構雖然外表表現(xiàn)形式各有差異,但是所有網(wǎng)絡游戲的底層游戲機制、數(shù)據(jù)結構和通信模型都是相似的:游戲世界由不變的地形信息、用戶控制的人物、可變的對象(如裝備等)、可分割的地形信息和由AI控制的非玩家角色(NPC)等組成。在DirectX中,為游戲開發(fā)者提供了實現(xiàn)網(wǎng)絡游戲的組件——DirectPlay。利用DirectPlay,可以在游戲中通過簡單的步驟實現(xiàn)網(wǎng)絡通信。在國內,幾乎都是使用IP網(wǎng)絡實現(xiàn)計算機的網(wǎng)絡通信。在IP網(wǎng)絡中可以通信的主機都可以通過DirectPlay實現(xiàn)游戲的聯(lián)網(wǎng)。DirectPlay中實現(xiàn)游戲通信的單位是會話(Session),一個會話代表一群玩家通過網(wǎng)絡連接在一起進行相同的聯(lián)機游戲。DirectPlay中的會話是指所有人在一個通信組中,可以相互通信,并且使用相同聯(lián)網(wǎng)游戲的玩家相互通信的過程。比如《星際爭霸》中,6個人加入一個創(chuàng)建游戲的主機開始進行對戰(zhàn),這在DirectPlay中就是一個通信會話。在一個會話中,任何一個游戲主機都可以和其他主機通信。當一個游戲玩家改變游戲中各種角色的位置時,就必須向其他所有在一個會話中的游戲主機發(fā)送更新消息,這樣其他玩家才會看到游戲世界中的正確變化。在DirectPlay中,會話支持兩種類型的消息拓撲結構——點對點模式和客戶端/服務器模式。
1.點對點模式在點對點模式下,每臺游戲主機都可以和其他的游戲主機進行通信。當游戲主機需要發(fā)送消息通知時,會向所有其他的游戲主機發(fā)送消息,如圖4-13所示。圖4-13中,當一臺游戲主機需要更新消息時,會向其他的三臺游戲主機都發(fā)送信息。由于每臺游戲主機之間都有通信消息,那么如果網(wǎng)絡帶寬過小,通信效率就會隨著一個會話中游戲主機數(shù)量的增大而降低,最終就會影響游戲的實時性。因此,對于通信量大的網(wǎng)絡游戲,不適合使用點對點模式的會話。在DirectX的開發(fā)文檔中,對點對點模式的建議數(shù)目是一個會話中最多存在20~30臺游戲主機。圖4-13點對點模式下游戲主機間的通信在使用點對點模式的會話時,一般需要使用下面的幾個步驟:
(1)初始化點對點會話對象;
(2)選擇會話使用的網(wǎng)絡協(xié)議;
(3)指定會話中的宿主;
(4)通過會話實現(xiàn)游戲通信;
(5)離開和終止會話。
2.客戶端/服務器模型客戶端和服務器這兩個術語可以追溯到20世紀80年代,用于指代連接到網(wǎng)絡上的個人計算機??蛻舳?服務器也可用于描述兩套計算機程序之間的關系——客戶端程序和服務器程序。客戶端向服務器請求某種服務(比如請求一個文件或數(shù)據(jù)庫訪問),服務器滿足請求并通過網(wǎng)絡將結果傳送到客戶端。雖然客戶端和服務器可以存在同一臺計算機中,但是通常它們都運行在不同計算機上。一臺服務器處理多個客戶端請求也是很常見的。在使用DirectPlay中的客戶端/服務器模式時,在一個會話中,只有一臺處于服務器角色的游戲主機,其他的游戲主機都是處于客戶端角色。當處于客戶端角色的游戲主機需要發(fā)送更新消息時,不是直接把消息發(fā)送到每一臺游戲主機,而是把更新消息發(fā)送給服務器,由服務器來把消息發(fā)送給其他的游戲主機,如圖4-14所示。圖4-14客戶端/服務器模型圖4-14中,游戲主機通信時都必須通過中間的服務器,由服務器來完成消息的復制和發(fā)送處理?,F(xiàn)在很多流行的聯(lián)網(wǎng)游戲都是使用客戶端/服務器模型來實現(xiàn)的。在使用客戶端/服務器模型的會話時,一般需要使用下面的幾個步驟:
(1)初始化客戶端/服務器會話對象;
(2)選擇會話使用的網(wǎng)絡協(xié)議;
(3)指定會話中的服務器;
(4)通過會話實現(xiàn)游戲通信;
(5)離開和終止會話。
4.4.2游戲中的3D圖形技術產生真實的虛擬環(huán)境是計算機圖形學孜孜以求的目標。在虛擬對象或場景的創(chuàng)建中要用到許多綜合處理過程,每一種都非常令人感興趣也非常重要。計算機輔助設計、科學可視化、模擬訓練、醫(yī)療成像、娛樂、廣告等,這些都要依賴于當今最前沿的計算機圖形技術。今天,許多種3D計算機圖形應用以極其驚人的速度成長著。最好的例子就是3D圖形技術在娛樂行業(yè)中的應用,包括非常流行的計算機3D游戲。這就使得我們在計算機中得到了現(xiàn)實生活中不能夠體驗到的感覺,從駕駛戰(zhàn)斗機到在熱帶叢林中冒險,無一不給人們極大的感官刺激。
3D指被描述或顯示的對象有寬度、高度和深度三個測量維度,又稱為三維。由于3D計算機繪圖最后只能在屏幕上呈現(xiàn),而DirectGraphics繪圖就像是拿著相機照蘋果所洗出來的相片。如果讓相片里出現(xiàn)蘋果,當然一定要有蘋果、相機和底片。先將蘋果放在任何一個地方,如桌子或電視機上,再將相機對準蘋果,裝好底片,在適當?shù)墓饩€下按下快門,然后等底片洗出來即可。即由坐標轉換(Transform)畫出蘋果的“形”,經過色彩計算(Lighting)決定蘋果的顏色,由平面繪制(Raster)將照片“洗”出來。在計算機的三維世界中,如果要顯示一個物體,首先關心的就是這個物體怎樣由點來構成,然后用這些點來構成多邊形,由多邊形來構成立體的幾何形體。只要能確定點的位置、數(shù)量、顏色,就可以形成任何需要的物體。
1.三維坐標系統(tǒng)如何在三維世界中表示點的位置呢?和平面圖形類似,三維世界中的點可以在坐標系中唯一地確定下來。圖4-15則分別描述了以下兩種三維坐標系統(tǒng):左手坐標系和右手坐標系。在左手坐標系中,使用左手來確定三維坐標系。如圖所示,左手四指彎曲,拇指與四指垂直,當四指彎曲的方向是x坐標軸(正方向)繞向y坐標軸(正方向)的方向時拇指所指的方向就是z坐標軸的正方向。右手坐標系即使用右手進行相應的判斷。由此可見,左手坐標系中z軸離我們而去,右手坐標系中z軸迎我們而來。使用左手坐標系,可以保證永遠使用正的z值來表示距離,再遠也沒有關系。這也比較符合日常的習慣,最重要的是可以方便程序的處理,所以在Direct3D中,使用了左手坐標系統(tǒng)來表示整個世界的位置。圖4-15三維坐標系統(tǒng)
2.觀察坐標系在三維坐標中觀察世界時,需要確定以下兩個問題:觀察位置和觀察方向。
1)觀察位置需要使用坐標來表示觀察點的準確位置,這個坐標是在計算機中的世界坐標系中的值。
2)觀察方向對于觀察者來說,觀察方向代表上方的方向。必須指定上方是哪個方向,才能看到正確的三維世界。當上面兩個問題確定以后,實際上就可以建立一個以觀察者為原點的三維坐標系,這就是觀察坐標系。把原來世界坐標系中所有物體的坐標轉換為觀察坐標系中的坐標以后,就可以知道每一個三維物體相對于觀察者的位置了。圖4-16顯示了世界坐標系和觀察坐標系的關系。圖4-16世界坐標系和觀察坐標系的關系如圖4-16所示,xW,yW,zW確定的坐標系為世界坐標系,xC,yC,zC確定的坐標系為觀察坐標系。觀察坐標系為一個攝像機確定的世界,最終看到的世界就是這個攝像機能夠觀察到的世界。那么,想要觀察世界坐標的某些景物,就必須讓攝像機在世界坐標系中移動,確定攝像機的觀察位置,同時把握攝像機鏡頭的方向,這樣才能在三維世界中任意觀察。有了觀察坐標系,就可以知道三維世界物體相對于觀察者的位置了。不過玩游戲時都是在電腦屏幕上看到的三維世界,如何使用攝像機把觀察到的世界顯示到屏幕上,就需要用到三維透視轉換。
3.三維透視轉換三維透視轉換(在DirectX中的英文稱為ProjectionTransformation)就是控制三維世界中的攝像機的過程,控制攝像機鏡頭光圈、焦距,從而得到想看到的世界??梢灾付〝z像機的可視范圍,來決定最終形成的平面圖像,如圖4-17所示。在圖4-17中,表示了攝像機如何觀察三維世界??梢灾付ㄒ粋€后視平面和前視平面,這兩個平面都表示成距攝像機的距離,前視平面到攝像機的距離小于后視平面到攝像機的距離。另外,還需要指定攝像機的視角,視角包括水平視角和垂直視角。水平視角是攝像機在水平方向上可以觀察到的三維景物的角度;垂直視角是攝像機在垂直方向上可以觀察到三維景物的角度。有了前視平面、后視平面、水平視角和垂直視角,就可以在三維世界中形成一個幾何空間,攝像機可以觀察到的三維景物范圍就是這個幾何空間。圖4-17三維透視轉換示意圖
4.頂點顏色的計算方法雖然在場景中可以直接指定幾何模型頂點顏色,在這種情況下并不需要任何光源,但是如果加上幾盞燈光,再通過表面材質方向,可以得到更真實的3D場景。DirectGraphics通過設定光源與材質,得到最終頂點的擴散色(diffuse)與反射色(specular)。要用DirectGraphics計算光,必須提供頂點法向量(Normal)、環(huán)境光或發(fā)射光(Light)和模型表面材質(Material)。
DirectGraphics計算光的方法如下:
(1)先換算距離的比例值:d?=?Range
(2)計算強弱因子:F?=?Attenuation()?+?Attenuation1*d?+?Attenuation2*(d^2)
(3)該點受到的光強度為F*Light。
(4)根據(jù)頂點法向量計算該點的受光強度,最后再根據(jù)表面材質(Material)的特性,計算出頂點的擴散色(diffuse)與反射色(specular),填入頂點中。
5.消隱與裁剪當用計算機繪制3D物體時,肯定存在距視點較遠和較近的多邊形,這樣就出現(xiàn)了一些多邊形遮擋了另一些的情況。必須繪制出可見的多邊形,而被擋住的多邊形不應該被繪制出來,這樣才能正確地實現(xiàn)3D物體顯示,要做到這點就要進行“面的消隱”??床坏降拿娌贿M行繪制,這樣顯示的圖形才是真實的3D物體。通常把判斷一個圖形是否處于一個指定范圍以內的算法叫做裁剪算法,或者簡單地稱之為裁剪。用作裁剪的區(qū)域一般叫做裁剪窗口。裁剪的應用相當?shù)貜V泛,在游戲中最常見的使用方法是定義場景的可視區(qū)域,減少不必要的圖形操作,提高效率。到目前為止,通過D3D的XCreate函數(shù)可以創(chuàng)建一些簡單的幾何物體,例如球體、圓柱體、立方體等。如果試圖通過手工指定頂點數(shù)據(jù)來創(chuàng)建3D物體,毫無疑問這將是一個相當枯燥的任務。為了減輕構建3D物體這種繁重的工作,人們開發(fā)了稱為3D建模工具的專業(yè)應用程序。這些建模工具允許用戶在一種可視化的交互環(huán)境中創(chuàng)建復雜而逼真的網(wǎng)格,并配有大量的工具集,這樣就大大簡化了3D建模的過程。例如,用于游戲制作的比較流行的建模工具有3dsmax、LightWave以及Maya等。這些建模工具能夠將網(wǎng)格數(shù)據(jù)(幾何信息、材質、動畫以及其他可能的有用數(shù)據(jù))導出到文件中。這樣就可以編寫一個文件讀取程序來提取網(wǎng)格數(shù)據(jù)并在3D應用程序中使用。還有一種更簡便的方法就是使用特殊的網(wǎng)格文件格式,稱為XFile格式(擴展名為?.X)。許多3D建模工具可以將模型數(shù)據(jù)導成這種格式,而且也有許多轉換程序(Converter)可以將其他較流行的網(wǎng)格文件格式轉換為?.X格式。XFile之所以使用方便,最主要的原因是它是DirectX定義的格式,所以該格式得到了D3DX庫的有力支持,即D3DX庫提供了對?.X格式的文件進行加載和保存的函數(shù)。所以在使用這種格式時,無需自己編寫這類文件的加載和保存程序。4.4.33D圖形渲染技術
3D渲染就是把三維坐標系中的場景顯示出來的過程。在計算機中,三維世界的表示由坐標系和坐標系中的點構成,還包括物體的材質、紋理、光照等信息。這些信息只是由計算機中的數(shù)據(jù)表示,并不能直接用來顯示在計算機屏幕中。3D渲染就是完成從計算機中的三維場景表示數(shù)據(jù)導出視平面上可以顯示的圖像的轉換過程。這一過程有一系列必須順序完成的操作,通常把整個過程叫做渲染流水線,又叫渲染管道(RenderingPipeline),如圖4-18所示。在這個過程中需要考慮的因素有:指定用來投影的虛擬攝像機、3D場景與模型本身、光源與光照模型、紋理與貼圖等。其中,場景與模型在屏幕上的形狀和位置等坐標信息由3D場景與模型本身,攝像機的位置、方向、視角等參數(shù)決定。而光源、光照模型、模型的材質、紋理與貼圖、光照計算和實現(xiàn)的方法決定3D場景與模型在屏幕上所呈現(xiàn)的外觀效果。
3D渲染技術在游戲制作中是最為復雜的技術,如果細分,可以分為地形渲染、物理渲染等,其最終目的就是最大程度地模擬真實世界的物理特性。比如在一個飛行模擬器中,理論上可以駕駛飛機朝任何一個無限遠飛去,因為事實也是如此,如果愿意,完全可以駕駛飛機繞著地球飛行而不用擔心有墻阻擋。換句話說,一個室外場景的理想大小是無限大。除了場景的大小以外,同時視野也是無限的。站在高處,可以俯視任何比所站位置低的地方,也就是說擁有幾乎無限的視野。這就是地形渲染技術要達到的目的。圖4-18DirectX3D的渲染流水線目前在物理渲染技術方面,比較著名的技術有“粒子”渲染技術、“Havok”渲染技術和目前最為先進的“幻3”渲染技術。粒子渲染技術第一次應用在《使命召喚2》中。Havok渲染技術應用在《古墓麗影7》中。“幻3”則應用在PS3上推出的《地獄之門:倫敦》和Xbox360上推出的《戰(zhàn)爭機器》上。為了讓讀者有更感性的認識,此處拿“粒子”和“幻3”兩種渲染技術做個比較。在《使命召喚2》(見圖4-19)中,槍、炮發(fā)射時候的煙霧會隨著時間的延遲而逐漸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度公路建設項目承包墊資合同樣本3篇
- 建設工程材料供應合同
- 山西省二手車買賣合同
- 2025年度個人版權使用合同范本3篇
- 服裝輔料快遞協(xié)議范本
- 餐飲店裝修墊資合同書
- 美妝行業(yè)市場調查居間合同
- 醫(yī)療行業(yè)入股協(xié)議書范文
- 2025年蔬菜腌制品項目可行性研究報告
- 2025年中國定制式義齒行業(yè)市場調研分析及投資戰(zhàn)略規(guī)劃報告
- 音樂教學集訓課程設計
- 2025內墻乳膠漆合同范文
- 肺切除手術的術前評估課件
- 護士的護理職業(yè)生涯規(guī)劃
- 2024電子商務平臺用戶隱私保護協(xié)議3篇
- 電力工程施工安全風險評估與防控
- 內分泌系統(tǒng)異常與虛勞病關系
- 義務教育數(shù)學課程標準(2022年版)重點
- 2021上海春考作文題解析及范文(怎樣做與成為什么樣人)
- DB3418T 008-2019 宣紙潤墨性感官評判方法
- 137案例黑色三分鐘生死一瞬間事故案例文字版
評論
0/150
提交評論