




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