[優(yōu)秀畢業(yè)設(shè)計(jì)精品] 基于direct3d的windows游戲開發(fā)_第1頁
已閱讀1頁,還剩43頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、<p>  畢業(yè)設(shè)計(jì)(論文)任務(wù)書</p><p>  發(fā)任務(wù)書日期:2008年10月20日</p><p><b>  任務(wù)書填寫要求</b></p><p>  1.畢業(yè)設(shè)計(jì)(論文)任務(wù)書由指導(dǎo)教師根據(jù)各課題的具體情況指導(dǎo)學(xué)生填寫。此任務(wù)書應(yīng)在畢業(yè)設(shè)計(jì)(論文)開始前一周內(nèi)填好并發(fā)給學(xué)生;</p><p> 

2、 2.任務(wù)書內(nèi)容必須用黑墨水筆工整書寫或按教務(wù)處統(tǒng)一設(shè)計(jì)的電子文檔標(biāo)準(zhǔn)格式(可從教務(wù)處網(wǎng)頁上下載)打印,不得隨便涂改或潦草書寫,禁止打印在其它紙上后剪貼;</p><p>  3.任務(wù)書內(nèi)填寫的內(nèi)容,必須和學(xué)生畢業(yè)設(shè)計(jì)(論文)完成的情況相一致,若有變更,應(yīng)當(dāng)經(jīng)過所在專業(yè)及系主管領(lǐng)導(dǎo)審批后方可重新填寫;</p><p>  4.任務(wù)書內(nèi)有關(guān)“系別”、“專業(yè)”等名稱的填寫,應(yīng)寫中文全稱,不能寫

3、數(shù)字代碼。學(xué)生的“學(xué)號(hào)”要寫全號(hào)(2000級(jí)為10位數(shù)),不能只寫最后2位或1位數(shù)字;</p><p>  5.任務(wù)書內(nèi)“主要參考文獻(xiàn)”的填寫,應(yīng)按照國標(biāo)GB 7714—87《文后參考文獻(xiàn)著錄規(guī)則》的要求書寫,不能有隨意性;</p><p>  6.有關(guān)年月日等日期的填寫,應(yīng)當(dāng)按照國標(biāo)GB/T 7408—94《數(shù)據(jù)元和交換格式、信息交換、日期和時(shí)間表示法》規(guī)定的要求,一律用阿拉伯?dāng)?shù)字書寫。

4、如“2004年3月15日”或“2004-03-15”。</p><p>  畢 業(yè) 設(shè) 計(jì)(論 文)任 務(wù) 書</p><p>  畢 業(yè) 設(shè) 計(jì)(論 文)任 務(wù) 書</p><p>  畢 業(yè) 設(shè) 計(jì)(論 文)任 務(wù) 書</p><p>  基于Direct3D的Windows游戲開發(fā)</p><p><b&g

5、t;  摘 要</b></p><p>  隨著電腦繪圖技術(shù)的不斷發(fā)展,3D繪圖硬件效能的增強(qiáng)以及寬帶網(wǎng)絡(luò)的普及,3D技術(shù)的應(yīng)用也有了新的風(fēng)貌。3D技術(shù)的使用非常廣泛,而且使用比較普遍的可能就是在3D游戲的制作領(lǐng)域。并且隨著電腦硬件的不斷升級(jí)和游戲開發(fā)庫的功能日益強(qiáng)大,游戲的真實(shí)性場景和炫麗的效果不斷沖擊著游戲玩的視角。</p><p>  DirectX是一種應(yīng)用程序接口(

6、API),它可讓以windows為平臺(tái)的游戲或多媒體程序獲得更高的執(zhí)行效率,加強(qiáng)3d圖形和聲音效果,并提供設(shè)計(jì)人員一個(gè)共同的硬件驅(qū)動(dòng)標(biāo)準(zhǔn),讓游戲開發(fā)者不必為每一品牌的硬件來寫不同的驅(qū)動(dòng)程序,也降低用戶安裝及設(shè)置硬件的復(fù)雜度。</p><p>  本論文介紹游戲開發(fā)庫DirectX相關(guān)技術(shù)。及勇者斗惡龍開發(fā)前期的策劃和設(shè)計(jì),并且較為詳細(xì)介紹了游戲各個(gè)功能的實(shí)現(xiàn)。</p><p>  關(guān)鍵詞:

7、3D;Windows游戲;DirectX;骨骼動(dòng)畫</p><p>  Progamming Games with Direct3D</p><p><b>  Abstract</b></p><p>  With computer graphics technology development, 3D graphics hardware p

8、erformance enhancements as well as the popularization of broadband networks, 3D technology also has a new outlook. 3D technology is widely used, but use may be more common in the field of 3D game production. And with the

9、 continuing escalation of computer hardware and game developers increasingly powerful function library, the authenticity of scenes and Games Behind the effect of constant impact on the game play perspective. </p>

10、<p>  DirectX is an application programming interface (API), which allows to windows as a platform for games or multimedia programs to achieve higher efficiency in the implementation and strengthening 3d graphics an

11、d sound effects, and to provide designers a common hardware-driven standards for the Games developers do not have for each brand of hardware to write a different driver, but also lowers the user to install and set up the

12、 hardware complexity. </p><p>  In this paper, introduce DirectX game development library related technology. And Dragon Quest pre-development planning and design, and more detailed information on the implem

13、entation of each functional Games.</p><p>  Key words: 3D;Windows’Game;DirectX; Skeletal Animation</p><p><b>  目 錄</b></p><p><b>  1緒 論1</b></p>

14、<p><b>  1.1背景1</b></p><p>  1.2我國游戲的現(xiàn)狀和未來趨勢1</p><p>  1.3論文的主要工作2</p><p><b>  2總體方案3</b></p><p>  2.1Microsoft Visual C++ 簡介3<

15、;/p><p>  2.2DirectX簡介4</p><p><b>  3游戲策劃5</b></p><p>  3.1游戲的簡要介紹5</p><p>  3.2背景和情節(jié)5</p><p>  3.3游戲各個(gè)角色和物品的素材6</p><p>  3

16、.3.1角色和物品6</p><p>  3.3.2物品6</p><p>  3.4場景設(shè)計(jì)7</p><p>  3.5游戲UI8</p><p>  4游戲設(shè)計(jì)與實(shí)現(xiàn)10</p><p>  4.1游戲基本流程10</p><p>  4.2游戲的實(shí)現(xiàn)及相關(guān)概念

17、10</p><p>  4.2.1地形的實(shí)現(xiàn)10</p><p>  4.2.2天空盒的現(xiàn)實(shí)13</p><p>  4.2.3UI的實(shí)現(xiàn)14</p><p>  4.2.4下雪效果的實(shí)現(xiàn)19</p><p>  4.2.5角色模型的實(shí)現(xiàn)20</p><p>  4.2.6

18、靜態(tài)模型的實(shí)現(xiàn)26</p><p>  4.2.7聲音系統(tǒng)的實(shí)現(xiàn)27</p><p>  4.2.8碰撞檢測的實(shí)現(xiàn)28</p><p>  4.2.9AI的實(shí)現(xiàn)28</p><p>  4.2.10拾取系統(tǒng)的實(shí)現(xiàn)29</p><p><b>  5總 結(jié)31</b><

19、/p><p><b>  參考文獻(xiàn)32</b></p><p><b>  致 謝33</b></p><p><b>  緒 論</b></p><p><b>  背景</b></p><p>  隨著電腦繪圖技術(shù)的不斷演進(jìn),

20、3D繪圖硬件效能的增強(qiáng)以及寬帶網(wǎng)絡(luò)的普及,3D技術(shù)的應(yīng)用也有了新的風(fēng)貌。目前3D技術(shù)的使用非常廣泛,它已經(jīng)成為各界研究、應(yīng)用的主題,3D應(yīng)用發(fā)展縱然也就成為了時(shí)勢所趨最熱門的研究話題,也是各行業(yè)努力的方向,它的發(fā)展主題跨及了制造設(shè)計(jì)、電子商務(wù)、動(dòng)畫制作、多媒體教學(xué)、虛擬現(xiàn)實(shí)以及游戲行業(yè)等。</p><p>  3D技術(shù)滿足了人們在視覺上擬真的需求,目前市場上可見的3D技術(shù)的應(yīng)用包括:單機(jī)游戲、網(wǎng)絡(luò)多人聯(lián)機(jī)游戲、虛

21、擬社群、訓(xùn)練模擬、科學(xué)可視化、網(wǎng)站廣告、網(wǎng)絡(luò)商品3D顯現(xiàn)、行動(dòng)式裝置(PDA或是手機(jī))游戲、廣告動(dòng)畫、3D特效合成、3D動(dòng)畫影集或3D動(dòng)畫電影等。從上述的應(yīng)用層面分析,3D技術(shù)一個(gè)較大的應(yīng)用市場在于娛樂軟件與3D動(dòng)畫特效制作等。在這樣一個(gè)科技迅猛發(fā)展、3D技術(shù)廣泛應(yīng)用的信息時(shí)代,我們的生活每天都在發(fā)生變化,游戲業(yè)迅速發(fā)展就是其中不可忽視的一個(gè)方面,尤其是3D技術(shù)在游戲中的運(yùn)用。如今國內(nèi)的游戲產(chǎn)業(yè)也在突飛猛進(jìn),3D游戲?qū)⑹鞘澜缇W(wǎng)絡(luò)游戲的發(fā)

22、展趨勢,因此3D技術(shù)的使用也將會(huì)變得更加普及。</p><p>  我國游戲的現(xiàn)狀和未來趨勢</p><p>  游戲產(chǎn)業(yè)處于整個(gè)動(dòng)漫游戲產(chǎn)業(yè)的末端,一度被視為動(dòng)漫產(chǎn)業(yè)的衍生產(chǎn)業(yè)。2000年國務(wù)院部署開展的電子游戲經(jīng)營場所專項(xiàng)治理至今余波未消,停止審批并大力壓減電子游戲經(jīng)營場所數(shù)量,禁止進(jìn)口電子游戲設(shè)備及其零附件,電子游戲在中國處于極度萎縮的狀況,單機(jī)版游戲則由于猖獗的盜版問題而難以實(shí)現(xiàn)盈

23、利??v觀中國游戲產(chǎn)業(yè)的發(fā)展現(xiàn)狀,網(wǎng)絡(luò)游戲依然是執(zhí)牛耳者。截止到2006年6月30口,中國互聯(lián)網(wǎng)網(wǎng)民人數(shù)達(dá)到了12300萬人,與2005年同期相比增長了19.4%,其中寬帶上網(wǎng)網(wǎng)民人數(shù)為7700萬人,在所有網(wǎng)民中的比例接近2/3,比2005年同期增加了2400萬人,增長率為45.3%,而寬帶上網(wǎng)的計(jì)算機(jī)數(shù)也迅速增長到2815萬臺(tái),我國真正迎來了“寬帶時(shí)代”。網(wǎng)民中網(wǎng)絡(luò)游戲玩家超過了3000萬人。2005年中國游戲產(chǎn)業(yè)報(bào)告顯示,我國網(wǎng)絡(luò)游戲

24、用戶的主要年齡段集中在19~25歲,其中19~22歲的占33.3%,23~25歲的占28.4%,加起來超過60%。對網(wǎng)民的上網(wǎng)地點(diǎn)分析發(fā)現(xiàn),網(wǎng)吧已經(jīng)成為網(wǎng)絡(luò)游戲發(fā)展的重地。</p><p>  根據(jù)IDC預(yù)測,2006年中國網(wǎng)絡(luò)游戲市場規(guī)模將達(dá)到50億元,這個(gè)數(shù)字低于其先前的預(yù)計(jì)。網(wǎng)絡(luò)游戲的發(fā)展強(qiáng)勢帶動(dòng)了相關(guān)產(chǎn)業(yè)的發(fā)展,據(jù)《2005年中國游戲產(chǎn)業(yè)報(bào)告》披露,2005年網(wǎng)絡(luò)游戲?qū)ο嚓P(guān)產(chǎn)業(yè)的總體貢獻(xiàn)為319.8億元。

25、其中,對通信業(yè)務(wù)的直接貢獻(xiàn)是173.4億元,對IT產(chǎn)業(yè)的直接貢獻(xiàn)是71.6億元,對媒體和傳統(tǒng)出版業(yè)的直接貢獻(xiàn)是37.1億元;網(wǎng)絡(luò)游戲產(chǎn)業(yè)對這三個(gè)產(chǎn)業(yè)的貢獻(xiàn)分別比2004年增加了22.7億元、7.9億元和1.3億元。此外,2005年網(wǎng)絡(luò)游戲還帶來了 37.7億元的游戲廣告收入。 </p><p>  2006年中國網(wǎng)絡(luò)游戲發(fā)展中也呈現(xiàn)出如下特點(diǎn)。</p><p>  (1)國產(chǎn)化比例提高,國

26、產(chǎn)網(wǎng)游數(shù)量繼續(xù)增長。據(jù)統(tǒng)計(jì),目前在中國上市的200款網(wǎng)絡(luò)游戲中,國產(chǎn)網(wǎng)游占54.5%,韓國網(wǎng)絡(luò)游戲的比例已經(jīng)降低到35.7%。僅從數(shù)量上看,國產(chǎn)網(wǎng)絡(luò)游戲已經(jīng)占據(jù)了半壁江山。這是文化部、信息產(chǎn)業(yè)部等有關(guān)部門積極實(shí)施民族游戲精品工程,支持鼓勵(lì)民族原創(chuàng)游戲發(fā)展的結(jié)果。但是,國產(chǎn)網(wǎng)絡(luò)游戲的質(zhì)量還需要不斷提高,從下載排名來看,在名列前12位網(wǎng)絡(luò)游戲中,國產(chǎn)游戲權(quán)占4席。</p><p>  (2)休閑類游戲已成為中國網(wǎng)絡(luò)游

27、戲市場重要的推動(dòng)力量。各種棋牌類、賽車類、益智類的綠色休閑游戲相繼推出,比如《跑跑卡丁車》、《瘋狂賽車》、《連連看》等內(nèi)容遠(yuǎn)遠(yuǎn)超過了一些大型角色扮演類游戲。由于這類休閑游戲耗時(shí)短、上手容易,很快受到了國內(nèi)廣大用戶的歡迎。據(jù)預(yù)測,休閑游戲在未來五年內(nèi)將占據(jù)整個(gè)游戲產(chǎn)業(yè)總收入的50%。</p><p>  (3)角色扮演類游戲本身類型也日益多樣化?,F(xiàn)在已經(jīng)不是《傳奇》類的打怪練級(jí)游戲的天下,體育競技、音樂舞蹈、航海冒

28、險(xiǎn)、星戰(zhàn)幻想系列題材內(nèi)容豐富的游戲也紛紛相繼推出,受到玩家的追捧,并占據(jù)了市場的主導(dǎo)。包括《大航海時(shí)代》、《星戰(zhàn)前夜》、《QQ音速》等游戲的推出,有力地推動(dòng)了角色扮演類游戲的結(jié)構(gòu)調(diào)整</p><p>  (4)免費(fèi)游戲成為潮流。從2005年底上海盛大公司宣布對旗卜《傳奇》、《傳奇世界》、《夢幻國度》等三款游戲永久免費(fèi)之后,2006年成為“免費(fèi)網(wǎng)游年”。2006年中國網(wǎng)絡(luò)游戲市場上已經(jīng)有超過70款永久免費(fèi)網(wǎng)游,可逐

29、漸與費(fèi)網(wǎng)游相抗衡。其中包括《航海世紀(jì)》、《魔力寶貝》等原來很受玩家歡迎的老游戲,也有《武林外傳》、《征途》等新游戲。</p><p><b>  論文的主要工作</b></p><p>  通過論文的解釋說明講述基于DirectX的Windows游戲設(shè)計(jì)的過程,介紹DirectX庫的一些常用接口和游戲一些主要部分的實(shí)現(xiàn)方法。</p><p>&

30、lt;b>  總體方案</b></p><p>  Microsoft Visual C++ 簡介</p><p>  Visual C++是一個(gè)功能強(qiáng)大的可視化軟件開發(fā)工具。自1993年Microsoft公司推出Visual C++1.0后,隨著其新版本的不斷問世,Visual C++已成為專業(yè)程序員進(jìn)行軟件開發(fā)的首選工具。</p><p>  

31、雖然微軟公司推出了Visual C++.NET(Visual C++7.0),但它的應(yīng)用的很大的局限性,只適用于Windows 2000,Windows XP和Windows NT4.0。所以實(shí)際中,更多的是以Visual C++6.0為平臺(tái)。</p><p>  Visual C++6.0不僅是一個(gè)C++編譯器,而且是一個(gè)基于Windows操作系統(tǒng)的可視化集成開發(fā)環(huán)境(integrated developmen

32、t environment,IDE)。Visual C++6.0由許多組件組成,包括編輯器、調(diào)試器以及程序向?qū)ppWizard、類向?qū)lass Wizard等開發(fā)工具。 這些組件通過一個(gè)名為Developer Studio的組件集成為和諧的開發(fā)環(huán)境。</p><p>  Visual C++它大概可以分成三個(gè)主要的部分:</p><p>  Developer Studio,這是一個(gè)集

33、成開發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫著“Microsoft Visual C++”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C++了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但實(shí)際上它沒有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會(huì)介紹。我們也知道,Developer Studio并不是專門用于VC的,它也同樣用于VB,VJ,VID等

34、Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當(dāng)成Visual C++, 它充其量只是Visual C++的一個(gè)殼子而已。</p><p>  MFC。從理論上來講,MFC也不是專用于Visual C++,Borland C++,C++Builder和Symantec C++同樣可以處理MFC。同時(shí),用Visual C++編寫代碼也并不意味著一定要用MFC,只要愿意,用V

35、isual C++來編寫SDK程序,或者使用STL,ATL,一樣沒有限制。不過,Visual C++本來就是為MFC打造的,Visual C++中的許多特征和語言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C++而不用MFC就等于拋棄了Visual C++中很大的一部分功能。但是,Visual C++也不等于MFC。</p><p>  Platform SDK。這才是Visual C++和整個(gè)Visual S

36、tudio的精華和靈魂,雖然我們很少能直接接觸到它。大致說來,Platform SDK是以Microsoft C/C++編譯器為核心(不是Visual C++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說到Developer Studio沒有編譯程序的功能,那么這項(xiàng)工作是由誰來完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。</p>&

37、lt;p>  Visual C++ 2005。微軟的Visual C++2005發(fā)布版本對于有志于輕松、迅速地編寫安全可靠的應(yīng)用程序的編程愛好者來說是正確地選擇。正如你所聽到的那樣,Visual C++中語言和庫的新特點(diǎn)使開發(fā)安全、可靠的應(yīng)用程序比以前更容易。它即提供了功能強(qiáng)大并且靈活的標(biāo)準(zhǔn)C++,又提供了適于.NET框架下編程的最強(qiáng)大的開發(fā)語言。</p><p><b>  DirectX簡介&

38、lt;/b></p><p>  DirectX是由微軟公司建立的游戲編程接口。由C++編程語言實(shí)現(xiàn),遵循COM。在Windows的平臺(tái)上影響力超越OpenGL并被多數(shù)PC 游戲開發(fā)商采用。最新版本DirectX9.0c (2006年12月13日)。另外,Windows Vista第5238版亦包含有 DirectX 10 的 Beta&

39、#160;版。 很多Windows游戲需要DirectX。DirectX包含DirectGraphic、DirectPlay、 DirectSound、DirectInput、DirectSetup等部份。 (Direct3D與DirectDraw已整合成DirectGraphic,而DirectShow亦已自原本的DirectX SDK中移到Windows平臺(tái)SDK了。 Redist 

40、Package 是媒體開發(fā)底層API,通過它可以開發(fā)游戲和其它媒體應(yīng)用程序。</p><p>  DirectX并不是一個(gè)單純的圖形API,它是由微軟公司開發(fā)的用途廣泛的API,它包含有Direct Graphics(Direct 3D+Direct Draw)、Direct Input、Direct Play、Direct Sound、Dir

41、ect Show、Direct Setup、Direct Media Objects等多個(gè)組件,它提供了一整套的多媒體接口方案。只是其在3D圖形方面的優(yōu)秀表現(xiàn),讓它的其它方面顯得暗淡無光。DirectX開發(fā)之初是為了彌補(bǔ)Windows 3.1系統(tǒng)對圖形、聲音處理能力的不足,而今已發(fā)展成為對整個(gè)多媒體系統(tǒng)的各個(gè)方面都有決定性影響的接口。</p><p>  Dire

42、ctX 是一組低級(jí)“應(yīng)用程序編程接口 (API)”,可為 Windows 程序提供高性能的硬件加速多媒體支持。Windows 支持 DirectX 8.0,它能增強(qiáng)計(jì)算機(jī)的多媒體功能。使用 DirectX 可訪問顯卡與聲卡的功能,從而使程序可提供逼真的三維 (3D) 圖形與令人如醉如癡的音樂與聲音效果。</p>&

43、lt;p><b>  游戲策劃</b></p><p><b>  游戲的簡要介紹 </b></p><p>  游戲利用一個(gè)高度圖文件來形成高低不同的地型再配以紋理圖片制造出一個(gè)雪地的環(huán)境。使用了6張?zhí)炜盏募y理圖片制作一個(gè)天空盒,天空盒的中心位置是游戲中英雄的位置,所以天空盒相對英雄角色是靜止的。加入了一個(gè)粒子系統(tǒng)模擬一個(gè)下雪的過程,再加

44、上一些樹的模型就構(gòu)成了游戲的場景了。</p><p>  游戲中的英雄角色和怪物角色的動(dòng)作是使用了蒙皮骨骼動(dòng)畫技術(shù)。通過該技術(shù)可以隨意的控制角色的動(dòng)作和在動(dòng)作發(fā)生的過程中產(chǎn)生所需要的事件(如攻擊時(shí)播放攻擊的音樂,計(jì)算角色在攻擊動(dòng)作發(fā)生后將自身的生命值減去傷害值)。</p><p>  游戲中采用的了第三人稱視覺,玩家在電腦屏幕上看到的畫面就是通過游戲里的攝像機(jī)拍攝出來的。攝像機(jī)會(huì)跟隨英雄角

45、色移動(dòng),也可以360度環(huán)繞英雄角色改變視覺的位置。</p><p>  游戲UI使用了點(diǎn)精靈實(shí)現(xiàn)角色的狀態(tài)顯示欄,并加以文字描述。游戲構(gòu)建了聲音系統(tǒng),聲音系統(tǒng)由背景音樂、英雄角色動(dòng)作音樂、還有NPC動(dòng)作音樂組成。游戲給NPC設(shè)定了AI,NPC可以根據(jù)情況做出不同的反應(yīng)和動(dòng)作。</p><p>  在游戲過程中。玩家可以控制英雄角色在場景中自由移動(dòng)。當(dāng)英雄角色進(jìn)入NPC的防范距離時(shí)NPC會(huì)主

46、動(dòng)接近英雄角色。當(dāng)NPC到了攻擊范圍時(shí)會(huì)主動(dòng)攻擊英雄角色。當(dāng)玩家選定了要攻擊的目標(biāo)時(shí),進(jìn)入到攻擊有效范圍可就以進(jìn)行攻擊。游戲會(huì)自己計(jì)算傷害然后在角色狀態(tài)欄中相應(yīng)顯示。當(dāng)NPC血量為0時(shí)會(huì)死亡隨機(jī)掉出物品該物品可以回復(fù)英雄角色的血量,當(dāng)英雄角色為血量為0量也會(huì)死亡,并在數(shù)秒后顯示游戲結(jié)束界面。</p><p><b>  背景和情節(jié)</b></p><p>  游戲發(fā)生

47、在一個(gè)魔幻的世界,英雄所在的村莊受到一條邪惡的冰龍破壞。本來小村莊里的人民過幸福的生活,但自從冰龍來了以后村莊變成一個(gè)冰封的世界。一位青年的英雄為了解救村莊,他拿起手中的劍與冰龍還有冰龍的手下開展了一場生死的搏斗。</p><p>  游戲各個(gè)角色物品和各場景的素材</p><p><b>  角色的設(shè)計(jì)</b></p><p>  游戲中的角

48、色如下表所示:</p><p>  表 3-1 角色屬性</p><p><b>  物品的設(shè)計(jì)</b></p><p>  游戲中增加英雄體力的物品蘋果如下圖所示:</p><p><b>  圖3-1 物品蘋果</b></p><p><b>  場景的設(shè)計(jì)&l

49、t;/b></p><p>  游戲中的天空盒圖片前和后如下圖所示:</p><p>  圖 32 天空盒圖片前 圖 33 天空盒圖片后</p><p>  游戲中的天空盒圖片右和左如下圖所示:</p><p>  圖 34 天空盒圖片右

50、 圖 35 天空盒圖片右</p><p>  游戲中的天空盒圖片上和下如下圖所示:</p><p>  圖 36 天空盒圖片上 圖 37 天空盒圖片下</p><p>  游戲中的樹模型如下圖所示:</p><p>  圖 38 樹模

51、型</p><p>  游戲中的房子模型如下圖所示:</p><p>  圖 39 房子模型</p><p><b>  游戲UI的設(shè)計(jì)</b></p><p>  游戲中的開始與結(jié)束界面如下圖所示: </p><p>  圖 3

52、10 游戲開始界面 圖 311 游戲結(jié)束界面</p><p>  游戲中的各角色狀態(tài)欄如下圖所示:</p><p>  圖 312 游戲中各角色態(tài)欄</p><p>  游戲中的按鈕和HP血量條如下圖所示:</p><p>  圖 313 按鈕

53、 圖 314 HP血量條</p><p><b>  游戲設(shè)計(jì)與實(shí)現(xiàn) </b></p><p><b>  游戲基本流程 </b></p><p>  圖4-1 基本流程圖</p><p>  游戲的實(shí)現(xiàn)及相關(guān)概念 </p><p>  游戲

54、的實(shí)現(xiàn)主要包括了地形的實(shí)現(xiàn)、天空盒的現(xiàn)實(shí)、UI的實(shí)現(xiàn)、下雪效果的實(shí)現(xiàn)、英雄角色及NCP模型的實(shí)現(xiàn)、靜態(tài)模型的實(shí)現(xiàn)、聲音系統(tǒng)的實(shí)現(xiàn)、AI的實(shí)現(xiàn)、碰撞檢測的實(shí)現(xiàn),拾取選定的實(shí)現(xiàn)。</p><p><b>  地形的實(shí)現(xiàn)</b></p><p>  游戲中的地形呈現(xiàn)出高低不同的起伏是利用了高度圖這一技術(shù)實(shí)現(xiàn)的。在3D游戲中坐標(biāo)分為XYZ。XZ表示地平面坐標(biāo)Y表示海拔高度,在

55、游戲的世界坐標(biāo)系中以XYZ為一點(diǎn)來表示一個(gè)位置。高度是圖其實(shí)就是一個(gè)數(shù)組,該數(shù)組的每個(gè)元素都指定了地形方格中某一特定的頂點(diǎn)的高度值。我們高度圖視以一個(gè)矩陣,這樣高度圖中的元素就與地形柵格中的頂點(diǎn)一一對應(yīng)。高度圖有多種可能的圖形表示,其中一種是灰度圖。地形中某一點(diǎn)的海拔越高,相應(yīng)地該點(diǎn)在灰度圖中的亮度就越大。</p><p>  我們利用一個(gè)灰度圖的資源,再加上紋理就可以創(chuàng)建一個(gè)地形了。下面講述地形類General

56、Terrain的主要構(gòu)成。</p><p>  class GeneralTerrain</p><p><b>  {</b></p><p><b>  public:</b></p><p>  GeneralTerrain(int r, int c, float length); </

57、p><p>  ~GeneralTerrain(void);</p><p>  bool SetVertexBuffer(IDirect3DDevice9 *Device, LPCSTR rawFileName, LPCSTR </p><p>  texFilename, float heightScale, bool OneTex = true); </p&

58、gt;<p>  void Render(IDirect3DDevice9 *Device);</p><p>  float GetHeight(int r, int l);</p><p>  void ComputeTriNormal(MAPCUSTOMVERTEX &v1, MAPCUSTOMVERTEX &v2, </p><p&

59、gt;  MAPCUSTOMVERTEX &v3, D3DVECTOR &normal);</p><p>  float GetPositionHeight(float x, float z);</p><p>  float Lerp(float a, float b, float t);</p><p>  void OnDestory();

60、</p><p><b>  private:</b></p><p>  int num_row;//每列頂點(diǎn)數(shù)</p><p>  int num_col;//每行頂點(diǎn)數(shù)</p><p>  float uTexSize;//平分后的紋理U坐標(biāo)</p>&

61、lt;p>  float vTexSize;//平分后的紋理V坐標(biāo)</p><p>  IDirect3DVertexBuffer9 *m_pVertexBuffer;</p><p>  IDirect3DTexture9 *Dtex;</p><p>  IDirect3DIndexBuffer9 *m_pIndexBuffer;</

62、p><p>  float length;//網(wǎng)格寬度</p><p>  vector<float> raw;//存放高度的容器</p><p><b>  };</b></p><p>  GeneralTerrain 構(gòu)造函數(shù)用于初始化地形中行的點(diǎn)數(shù)和列的點(diǎn)數(shù)還有之間的距離。S

63、etVertexBuffer用于設(shè)置地形紋理,Device是設(shè)備指針,rawFileName是文件路徑,texFilename是紋理資源的路徑,heightScale是高度的相對比例值,OneTex是否一張紋理顯示。Render用于渲染時(shí)調(diào)用。GetHeight用于得到指定的行列相交點(diǎn)的高度。ComputeTriNormal用于計(jì)算向點(diǎn)法向量。GetPositionHeight用于得到世界坐標(biāo)系中的高度。Lerp用于線性插值。</

64、p><p>  當(dāng)程序加載了高度圖和紋理之后,就可以顯示在游戲中。我們在主程序中加入GeneralTerrain *terrain這個(gè)變量,然后在主程序的OnCreateDevice函數(shù)中對terrain進(jìn)行初始化,在主程序的OnFrameRender調(diào)用terrain的Render函數(shù)進(jìn)行渲染。當(dāng)游戲結(jié)果時(shí)在主程序的OnDestroyDevice中調(diào)用terrain的OnDestory來釋放資源。而游戲中的角色和物

65、體的高度就可以通過GetPositionHeight傳入自己在世界坐標(biāo)系中的XZ坐標(biāo)來得到對應(yīng)的高度,從而構(gòu)成3D游戲中的三維坐標(biāo)。</p><p>  下面講述GeneralTerrain的渲染函數(shù)Render的實(shí)現(xiàn)</p><p>  void GeneralTerrain::Render(IDirect3DDevice9 *Device)</p><p>&l

66、t;b>  {</b></p><p>  Device->SetTexture(0,Dtex);//將地形紋理選入設(shè)備。</p><p>  Device->SetStreamSource(0,m_pVertexBuffer,0,sizeof(MAPCUSTOMVERTEX));//將地</p><p>  形頂點(diǎn)緩存選入設(shè)備。<

67、;/p><p>  Device->SetIndices(m_pIndexBuffer);//將地形頂點(diǎn)索引選入設(shè)備</p><p>  Device->SetFVF(MAPCUSTOMVERTEX_FVF);//設(shè)置頂點(diǎn)格式</p><p>  D3DXMATRIX I;</p><p>  D3DXMatrixIdentity(&

68、amp;I);</p><p>  Device->SetTransform(D3DTS_WORLD, &I);//設(shè)備世界坐標(biāo)系坐標(biāo)</p><p>  Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, </p><p>  0,this->num_col*this->num_r

69、ow,0,(this->num_col-1)*(this->num_row-1)*2);//渲染地形</p><p><b>  }</b></p><p>  下面講述GeneralTerrain的渲染函數(shù)GetPositionHeight的實(shí)現(xiàn)</p><p>  float GeneralTerrain::GePositio

70、nHeight(float x, float z)</p><p><b>  {</b></p><p>  //將地圖移動(dòng)到原點(diǎn),方便計(jì)算</p><p>  x = ((float)(num_col-1)*length / 2.0f) + x;</p><p>  z = ((float)(num_row-1)*l

71、ength / 2.0f) - z;</p><p>  //將地圖大小單位化,方便計(jì)算</p><p>  x /= (float)length;</p><p>  z /= (float)length;</p><p>  //計(jì)算x,z坐標(biāo)所在的行列值</p><p>  float col = ::floor

72、f(x);</p><p>  float row = ::floorf(z);</p><p>  // 獲取如下圖個(gè)頂點(diǎn)的高度</p><p><b>  // </b></p><p><b>  // A B</b></p><p><b>  //

73、 *---*</b></p><p><b>  // | / |</b></p><p>  // *---* </p><p><b>  // C D</b></p><p>  loat A = GetHeight((int)row, (int)col);<

74、/p><p>  float B = GetHeight((int)row, (int)col+1);</p><p>  float C = GetHeight((int)row+1, (int)col);</p><p>  float D = GetHeight((int)row+1, (int)col+1);</p><p>  f

75、loat dx = x - col;</p><p>  float dz = z - row;</p><p>  float height = 0.0f;</p><p>  if(dz < 1.0f - dx)//(x,z)點(diǎn)在ABC三角形上</p><p><b>  {</b></p>&l

76、t;p>  float uy = B - A;</p><p>  float vy = C - A;</p><p>  height = A + Lerp(0.0f, uy, dx) + Lerp(0.0f, vy, dz);//線形插值得到高度</p><p><b>  }</b></p><p>  el

77、se//(x,z)點(diǎn)在BCD三角形上</p><p><b>  {</b></p><p>  float uy = C - D;</p><p>  float vy = B - D;</p><p>  height = D + Lerp(0.0f, uy, 1.0f - dx) + Lerp(0.0f, vy,

78、1.0f - dz);</p><p><b>  }</b></p><p>  return height;</p><p><b>  }</b></p><p><b>  天空盒的現(xiàn)實(shí)</b></p><p>  天空盒實(shí)現(xiàn)就是一個(gè)擁有6張帶

79、有遠(yuǎn)景的UV紋理的大正方形盒子,盒子包圍著大部分的游戲場景。當(dāng)英雄角色移動(dòng)時(shí)盒子跟隨移動(dòng)。下面講述天空類BoxSky的實(shí)現(xiàn)</p><p>  class BoxSky</p><p><b>  {</b></p><p><b>  public:</b></p><p><b>  

80、BoxSky();</b></p><p>  ~BoxSky(void);</p><p>  void OnDestroy();</p><p><b>  //創(chuàng)建紋理及頂點(diǎn)</b></p><p>  bool SetVertexBuffer(IDirect3DDevice9 *Device, LPC

81、STR fontFileName, LPCSTR </p><p>  backFileName, LPCSTR leftFileName, LPCSTR rightFileName, LPCSTR topFileName, </p><p>  LPCSTR bottomFileName, float skywidth, float skyheight);</p><

82、p>  void Render(IDirect3DDevice9 *Device, D3DXMATRIX *pos=NULL); //渲染</p><p><b>  private:</b></p><p>  IDirect3DTexture9 *Skytex[6];</p><p>  IDirect3DVertexBuffer9

83、*m_pVertexBuffer;</p><p><b>  };</b></p><p>  SetVertexBuffer用于加載天空盒中的六張圖片資源和設(shè)置天空盒相對中世界坐標(biāo)系中的長和寬。Render用于渲染天空盒。參數(shù)pos表示在世界坐標(biāo)系中的位置矩陣也就是天空盒的中心位置。</p><p>  當(dāng)程序加載了天空盒的圖片資源后,將圖

84、片設(shè)置成對應(yīng)的UV紋理和設(shè)定好相對位置就可以顯示在游戲中。我們在主程序中加入BoxSky boxsky這個(gè)變量,然后在主程序的OnCreateDevice函數(shù)中對boxsky進(jìn)行初始化將相對位置設(shè)置成5000個(gè)坐標(biāo)單位,在主程序的OnFrameRender調(diào)用boxsky的Render函數(shù)進(jìn)行渲染在渲染的時(shí)候傳入英雄角色的坐標(biāo)就可以在世界坐標(biāo)系中決定天空盒的顯示位置。當(dāng)游戲結(jié)果時(shí)在主程序的OnDestroyDevice中調(diào)用boxsky

85、的OnDestory來釋放資源。</p><p>  下面講述BoxSky的渲染函數(shù)Render的實(shí)現(xiàn)</p><p>  void BoxSky::Render(IDirect3DDevice9 *Device, D3DXMATRIX *pos)</p><p><b>  {</b></p><p>  //設(shè)置紋理

86、尋址模式</p><p>  Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);</p><p>  //設(shè)置世界坐標(biāo)系中的坐標(biāo)</p><p>  if(pos == NULL)</p><p><b>  {</b>

87、</p><p>  D3DXMATRIX temp;</p><p>  D3DXMatrixIdentity(&temp);</p><p>  Device->SetTransform(D3DTS_WORLD, &temp);</p><p><b>  }</b></p>&l

88、t;p><b>  else</b></p><p><b>  {</b></p><p>  Device->SetTransform(D3DTS_WORLD, pos);</p><p><b>  }</b></p><p>  //加載頂點(diǎn)緩存,和頂點(diǎn)格式

89、,關(guān)閉光源。</p><p>  Device->SetStreamSource(0,this->m_pVertexBuffer,0,sizeof(CUSTOMVERTEX));</p><p>  Device->SetFVF(CUSTOMVERTEX_FVF);</p><p>  Device->SetRenderState(D3DRS

90、_LIGHTING, false);</p><p>  //循環(huán)顯示天空盒中的各個(gè)面</p><p>  for(int i = 0; i<6; i++)</p><p><b>  {</b></p><p>  Device->SetTexture(0, Skytex[i]);</p>&

91、lt;p>  Device->DrawPrimitive(D3DPT_TRIANGLESTRIP,i*4,2);</p><p><b>  }</b></p><p>  Device->SetRenderState(D3DRS_LIGHTING, true);//設(shè)置設(shè)備光源為開啟</p><p><b>  }

92、</b></p><p><b>  UI的實(shí)現(xiàn)</b></p><p>  游戲中的UI是使用了DirectX里的一個(gè)ID3DXSprite接口來實(shí)現(xiàn)的。ID3DXSprite是DriectX 9.0里面的一個(gè)簡單模塊,在DriectX 9.0幫助文檔里面對其功能的描述為:“向用戶提供一套簡單的在屏幕上實(shí)現(xiàn)精靈渲染的接口。”何為精靈渲染,說白了就是渲染2

93、D畫面,ID3DXSprite幫助用戶透過簡單的操作就能運(yùn)用DriectX 9.0制作2D游戲(渲染2D圖形),ID3DXSprite的功能還包括:幫助用戶在3D游戲里面實(shí)現(xiàn)“公告牌”技術(shù)。游戲中正是利用了“公告牌”技術(shù)再配合自定制的按鈕和文字系統(tǒng)來實(shí)現(xiàn)游戲的啟動(dòng)界面、游戲結(jié)束界面、角色狀態(tài)欄的UI界面。</p><p>  ID3DXSprite的使用過程一般如下:一、利用D3DXCreateSprite函數(shù)得

94、到一個(gè)ID3DXSprite的實(shí)例對象。二、加載相關(guān)的要顯示的UI紋理。三、設(shè)置顯示屬性。四、顯示渲染UI。五、回收資源。游戲中對ID3DXSprite的使用封裝了一個(gè)CSprite類,下面來講述游戲中的UI類CSprite的實(shí)現(xiàn)</p><p>  class CSprite</p><p><b>  {</b></p><p><b

95、>  public:</b></p><p>  CSprite();</p><p>  ~CSprite();</p><p>  HRESULT Init(IDirect3DDevice9* pd3dDevice);</p><p>  HRESULT LoadTexture(IDirect3DDevice9 *pd3

96、dDevice,UINT index,LPCWSTR sthPath);</p><p>  HRESULT Render(UINT Index);</p><p>  D3DXVECTOR2 SetPosition(D3DXVECTOR2*pos);</p><p>  D3DXVECTOR2* GetPosition();</p><p>

97、;  float SetAngle(float angle);</p><p>  float GetAngle();</p><p>  D3DXVECTOR2 SetSize(D3DXVECTOR2*size);</p><p>  D3DXVECTOR2* GetSize();</p><p>  void OnLostDevice()

98、;</p><p>  void Destory();</p><p>  void SetIsRender(bool isrender);</p><p>  bool IsRender();</p><p><b>  private:</b></p><p>  UINT m_TexInde

99、x;//當(dāng)前要渲染的索引</p><p>  ID3DXSprite* m_pPicSprite;//實(shí)例指針</p><p>  LPDIRECT3DTEXTURE9 m_pTex[9];//UI紋理數(shù)組</p><p>  float m_angle;//旋轉(zhuǎn)角度</p><p>  bool m_isRender;//是否渲染標(biāo)志<

100、;/p><p>  D3DXVECTOR2 m_size;//顯示大小</p><p>  D3DXVECTOR2 m_position;//顯示位置</p><p><b>  };</b></p><p>  Init用于得到ID3DXSprite的實(shí)例對象。LoadTexture用于加載要顯示的UISetPositi

101、on、GetPosition用于設(shè)置或得到某特定UI在游戲窗口中的二維坐標(biāo)(注:窗口左上角的坐標(biāo)為(0,0))。SetSize用于設(shè)置某特定UI的大小。</p><p>  當(dāng)游戲加載了指定的UI圖片時(shí),就可以根據(jù)程序的需要來顯示相應(yīng)的UI界面我們在主程序中加入CSprite*g_pBillBoard這個(gè)變量。在OnCreateDevice里new一個(gè)CSprite的實(shí)例對象并將指針傳給pBillBoard,調(diào)用

102、pBillBoard的LoadTexture函數(shù)來加載UI資源。在OnResetDevice里調(diào)用pBillBoard的Init函數(shù)來實(shí)例化ID3DXSprite對象。OnLostDevice里調(diào)用pBillBoard的OnLostDevice函數(shù),當(dāng)游戲結(jié)束時(shí)在OnDestroyDevice里調(diào)用pBillBoard的Destory函數(shù)回收資源。主程序中添加了一個(gè)全局函數(shù)RenderUI用于渲染UI時(shí)做相關(guān)的設(shè)置。只要在OnFrame

103、Render函數(shù)里添加RenderUI函數(shù)就可以顯示相應(yīng)的UI了。下面展示出RenderUI函數(shù)的內(nèi)容,說明如何顯示相應(yīng)的UI。</p><p>  下面講述CSprite的渲染函數(shù)Render的實(shí)現(xiàn)</p><p>  HRESULT CSprite::Render(int Index)</p><p><b>  {</b></p&g

104、t;<p>  HRESULT hr;</p><p>  //設(shè)置UI在窗口中的二維坐標(biāo)</p><p>  D3DXMATRIX mat;</p><p>  D3DXMatrixTransformation2D(&mat, NULL, m_angle, &m_size,</p><p>  NULL, 0,

105、 &m_position); </p><p>  m_pPicSprite->SetTransform(&mat);</p><p>  //設(shè)置啟用ALPAHA通道,并渲染</p><p>  m_pPicSprite->Begin(D3DXSPRITE_ALPHABLEND );</p><p>  

106、hr=m_pPicSprite->Draw(m_pTex[Index],NULL , NULL,NULL, 0xffffffff);</p><p>  m_pPicSprite->End();</p><p>  return hr;</p><p><b>  }</b></p><p>  程序添加了一

107、個(gè)BillBoardInfo結(jié)構(gòu)的全局變量用于控制UI的顯示。BillBoardInfo結(jié)構(gòu)的內(nèi)容如下:</p><p>  struct BillBoardInfo</p><p><b>  {</b></p><p>  BillBoardInfo()</p><p><b>  {</b>&

108、lt;/p><p>  herobloodPercent=_monsterbloodPercent=_monsterbloodPercent=0;</p><p><b>  };</b></p><p>  float _herobloodPercent;//英雄角色狀態(tài)欄中血量條的當(dāng)前血量顯示百分比</p><p>  

109、float _monsterbloodPercent;//怪物角色狀態(tài)欄中血量條的當(dāng)前血量顯示百分比</p><p>  float _MonsterIndex;//要顯示的怪物狀態(tài)欄索引</p><p><b>  };</b></p><p>  下面講述主程序中的RenderUI函數(shù)的實(shí)現(xiàn)</p><p>  vo

110、id RenderUI()</p><p><b>  {</b></p><p>  //判游戲是否開始,如果是剛根據(jù)情況渲染角色狀態(tài)欄</p><p>  if(g_bGameStart)</p><p><b>  {</b></p><p>  //保存舊的坐標(biāo),角度

111、和大小</p><p>  D3DXVECTOR2 oldpos;</p><p>  D3DXVECTOR2 oldsize;</p><p>  float oldangle;</p><p>  //防止顯示的血量倒流</p><p>  if(g_billBoardInfo._herobloodPercent&

112、lt;=0.0f)</p><p>  g_billBoardInfo._herobloodPercent=0;</p><p>  if(g_billBoardInfo._monsterbloodPercent<=0.0f)</p><p>  g_billBoardInfo._monsterbloodPercent=0;</p><p&

113、gt;  if(g_pBillBoard->IsRender())</p><p><b>  {</b></p><p><b>  //設(shè)置英雄UI</b></p><p>  oldpos=g_pBillBoard->SetPosition(&D3DXVECTOR2(0.0f,0.0f));&l

114、t;/p><p>  oldsize=g_pBillBoard->SetSize(&D3DXVECTOR2(1.2f,1.2f));</p><p>  g_pBillBoard->Render(2);</p><p>  g_pBillBoard->SetPosition(&oldpos);</p><p> 

115、 g_pBillBoard->SetSize(&oldsize);</p><p>  oldpos=g_pBillBoard->SetPosition(&D3DXVECTOR2(145.0f,37.2f)); </p><p>  oldsize=g_pBillBoard->SetSize(&D3DXVECTOR2(1.2f*g_billBoar

116、dInfo.</p><p>  _herobloodPercent,1.35f));</p><p>  g_pBillBoard->Render(6);</p><p>  g_pBillBoard->SetPosition(&oldpos);</p><p>  g_pBillBoard->SetSize(&a

117、mp;oldsize);</p><p>  //設(shè)置被選怪物UI</p><p>  if((g_billBoardInfo._MonsterIndex>2&&g_billBoardInfo._MonsterIndex<6))</p><p><b>  {</b></p><p>  ol

118、dpos=g_pBillBoard->SetPosition(&D3DXVECTOR2(450.0f,5.0f));</p><p>  oldsize=g_pBillBoard->SetSize(&D3DXVECTOR2(1.2f,1.2f));</p><p>  g_pBillBoard->Render(g_billBoardInfo._Monste

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論