3d游戲編程入門(c#)_第1頁(yè)
3d游戲編程入門(c#)_第2頁(yè)
3d游戲編程入門(c#)_第3頁(yè)
3d游戲編程入門(c#)_第4頁(yè)
已閱讀5頁(yè),還剩138頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

3D游戲編程入門(〇#)目錄第I部分Microsoft.NET簡(jiǎn)介第1章游戲開發(fā)和托管代碼3什么是.NET??,…3什么是托管代碼?…”5使用MicrosoftVisualStudio.NET2003IDE編寫代碼,…5C#代碼…6VB.NET代碼…8在命令行中編譯.NET代碼?…9游戲開發(fā)簡(jiǎn)述……10開發(fā)人員?…10游戲開發(fā)過程??…11工具…12小結(jié),?…16第n部分圖形和游戲1的介紹第2章策劃第一個(gè)游戲“??19提出游戲構(gòu)想……19理解ー個(gè)3D游戲的需求?…21游戲規(guī)范……24小結(jié)…26第3章理解示例框架…27創(chuàng)建項(xiàng)目?…27枚舉所有設(shè)備選項(xiàng)?…32小結(jié)…39第4章在屏幕上顯示…404.!創(chuàng)建設(shè)備,…40開始繪圖……47加載并繪制網(wǎng)格……48在場(chǎng)景中添加照相機(jī)?…51小結(jié)…54第5章完成代碼“”55理解高分辨率計(jì)時(shí)器……55處理丟失的設(shè)備,…60添加幀速率輸出…63設(shè)計(jì)UI界面”,…65設(shè)計(jì)按鈕,…72小結(jié)…75第6章實(shí)現(xiàn)用戶界面…76設(shè)計(jì)主菜單,…76插入到游戲引擎中,…81選擇人物(Loopy)”84利用新界面更新游戲引擎……91小結(jié)?…95第7章實(shí)現(xiàn)玩家和塊…96編寫Player對(duì)象…96設(shè)計(jì)塊?…104小結(jié)…110第8章實(shí)現(xiàn)級(jí)別對(duì)象…?111實(shí)現(xiàn)級(jí)別?…111控制玩家的移動(dòng)?…116第9章綜合應(yīng)用124包含玩家…124掛鉤級(jí)別,…128實(shí)現(xiàn)退出界面…132結(jié)束工作…135小結(jié)…140第HI部分基本的數(shù)學(xué)規(guī)則第10章3D數(shù)學(xué)快速入門…,14510,12D與3D145使用3D點(diǎn),,…147操作3D對(duì)象…148平移(移動(dòng))對(duì)象?…149縮放?…149旋轉(zhuǎn)…150坐標(biāo)系…150數(shù)學(xué)結(jié)構(gòu)…151向量…151矩陣…154小結(jié)?…157第IV部分間接圖形、對(duì)等網(wǎng)、游戲2第11章開始創(chuàng)建游戲161Tankers—下ー個(gè)游戲構(gòu)想,…161倉(cāng)リ建Tankers項(xiàng)目……163項(xiàng)目的圖形繪制,…169

第12章開發(fā)更先進(jìn)的用戶界面…174使用Blockers的基類(Base類),174添加新的基類…179實(shí)現(xiàn)主界面…182利用用戶界面繪制3D模型?…189小結(jié),…193第13章繪制真實(shí)的坦克,…194理解網(wǎng)格層次結(jié)構(gòu),“…194加載坦克層次結(jié)構(gòu)…197繪制網(wǎng)格層次……199操作坦克…201坦克的屬性……204創(chuàng)建照相機(jī)類……207小結(jié)…210第14章天空?級(jí)別?玩家!--211沒有天空的世界將是黑色的世界?…211有了一個(gè)天空,但坦克不能驅(qū)動(dòng)到那里,…214控制坦克……216IMoveableObject接口…225基本碰撞檢測(cè),…231小結(jié),?…234第15章準(zhǔn)備,瞄準(zhǔn),開火!--235實(shí)現(xiàn)Ammunition類……235Bullets集合……242

小結(jié)?…248第16章避免單人游戲的枯燥?…249使用DirectPlay■249創(chuàng)建會(huì)話…255加入會(huì)話…257事件處理程序,…258發(fā)送及接收數(shù)據(jù),i260小結(jié)…265第17章完成Tankers游戲,…266插入到游戲引擎中,i266繪制游戲,…272小結(jié)…275第V部分高級(jí)繪圖、客戶/服務(wù)器網(wǎng)絡(luò)和游戲3第18章添加特殊效果…279實(shí)現(xiàn)基本粒子系統(tǒng)…279繪制粒子系統(tǒng)……287將各部分連接到ー起,i290小結(jié)…292第19章構(gòu)建自己的游戲293闡明思想,…293創(chuàng)建自己的項(xiàng)目,…294設(shè)計(jì)用戶界面,…300小結(jié)…305第20章可編程流水線…,306編寫VertexShader"309使用著色增加逼真度……314添加Pixelshader315小結(jié)?…317第21章控制細(xì)節(jié)的級(jí)別?…318簡(jiǎn)化網(wǎng)格,…318使用簡(jiǎn)化的網(wǎng)格,…322使用漸進(jìn)網(wǎng)格控制細(xì)節(jié)的級(jí)別?…323小結(jié),…324第22章使用繪圖目標(biāo)創(chuàng)建特效-32522.!繪制跑道和多輛―丁車?…325創(chuàng)建繪圖目標(biāo)和表面……331將場(chǎng)景繪制到繪圖目標(biāo)?…333演示后視鏡,…334小結(jié)?…335第23章理解高級(jí)渲染語(yǔ)言2336理解老的shader模型的限制?…336添加卡丁車鏡面高亮…337逐pixel鏡面高亮,…340小結(jié)…343第24章關(guān)于性能的注意事項(xiàng)?…344事件模型和ManagedDirectX344生成本機(jī)程序集,…345Boxing惡夢(mèng)……346ManagedDirectX的速度……348

24.6小結(jié),,…350第V!部分附錄附錄A開發(fā)級(jí)別創(chuàng)建器,…353成為游戲開發(fā)人員的條件我所遇到的每ー個(gè)開發(fā)人員都至少在某一段時(shí)間想成為ー個(gè)游戲開發(fā)人員。對(duì)于很多人來說,視頻游戲不只是空閑時(shí)的ー種愛好,他們完全被游戲所吸弓I。人們沉浸在這些虛擬世界中,常常夢(mèng)想由自己創(chuàng)建如此神奇的天地。不要被美麗的圖形、奇妙的故事情節(jié)和感人悅耳的音樂所愚弄,編寫游戲是非常困難的工作,只有某些特定的開發(fā)人員才能夠獲得成功。除了所需要的技術(shù)天賦之外,ー個(gè)優(yōu)秀的游戲開發(fā)人員應(yīng)當(dāng)擁有其他ー些技能,例如,您首先是ー個(gè)游戲愛好者。如果不是游戲愛好者,則不可能編寫出偉大的游戲,這ー條件使得游戲開發(fā)工作更具有挑戰(zhàn)性。成為游戲開發(fā)人員確實(shí)不是一件容易的事情。如果沒有經(jīng)驗(yàn),則不會(huì)被游戲開發(fā)公司聘用,并且當(dāng)沒有公司聘用時(shí),將更難以獲得經(jīng)驗(yàn)。當(dāng)前只有少量的課程以及某些學(xué)校專注于講授游戲的開發(fā)。但是,入門的最好方式是制作一個(gè)樣片(demoreel)。它能向您未來的老板展示您的能力和處理事情的方式。通過本書,您將制作出ー個(gè)引人注目的樣片。讀者對(duì)象我常常被問到:“為什么每個(gè)人都想使用.NETFramework編寫游戲程序?”。其他的問題包括:".NETFramework不是只用于Web服務(wù)器應(yīng)用程序的嗎?”,“它不是很慢嗎?”,等等。對(duì)于游戲開發(fā)人員(或者未來的游戲開發(fā)人員)來說,這些都是很重要的問題,但他們誤解了.NETFramework〇.NETFramework不是最新的Web服務(wù)器版本,也不是任何服務(wù)器組件的擴(kuò)展。當(dāng)然能夠使用.NETFramework創(chuàng)建強(qiáng)大的Web服務(wù)器應(yīng)用程序,但是,這并不是它們的全部功能。.NETFramework包括ー?種功能強(qiáng)大的客戶端應(yīng)用程序編程接口(API)以及ManagedDirectX?實(shí)際上.NET開發(fā)人員需要掌握整個(gè)DirectXAPI〇利用它能夠編寫很多新的應(yīng)用程序,包括游戲。如果認(rèn)為.NETFramework只能夠編寫服務(wù)器應(yīng)用程序,則顯得有一點(diǎn)單純。您也可以利用它創(chuàng)建復(fù)雜的客戶端應(yīng)用程序。關(guān)于.NET的性能問題仍然存在,這些問題也很難簡(jiǎn)單描述。當(dāng)引入ー門“新的”語(yǔ)言或者運(yùn)行庫(kù)時(shí),開發(fā)人員在采用之前,通常比較猶豫。不久以前,很多游戲仍然是采用匯編語(yǔ)言編寫的,因?yàn)橛螒蜷_發(fā)人員不相信C或者C++語(yǔ)言足夠快。.NETFramework也遵循這個(gè)規(guī)則。在證明.NETFramework的性能之前,游戲開發(fā)人員都會(huì)以…種懷疑的眼光看待它。在本書中,大量的游戲是使用.NET運(yùn)行庫(kù)開發(fā)的。事實(shí)勝于雄辯,與其喋喋不休地討論.NET運(yùn)行庫(kù)的性能有多好,還不如讓本書中一些真實(shí)的游戲來證明這一點(diǎn)。為什么使用.NETFramework任何曾經(jīng)編寫過Windows程序的人都(無論是否使用.NETFramework)能夠認(rèn)識(shí)到,即使使用Win32API編寫簡(jiǎn)單的Windows應(yīng)用程序都比較困難。設(shè)計(jì).NETFramework的目的是提供ー?種較簡(jiǎn)單的方式來執(zhí)行在Windows程序中一些常見的事情,并且為普通的開發(fā)人員自動(dòng)處理很多問題,例如內(nèi)存的管理。利用.NETFramework,開發(fā)人員可以省去很多麻煩的任務(wù),例如花費(fèi)三天的時(shí)間尋找ー.個(gè)內(nèi)存泄漏bug,他們可以將一些功能直接添加到正在編寫的游戲里面。很多情況下,從游戲中刪除某些好的特性是因?yàn)樾枰ㄙM(fèi)大量的時(shí)間解決問題,而這些問題.NETFramework已經(jīng)為您解決。,NETFramework的另外一個(gè)令人感興趣的特性是語(yǔ)言的中立性。只要所使用的功能兼容公共語(yǔ)言規(guī)范(CommonLanguageSpecification,CLS),則可以采用任何能夠使用CLS兼容功能的語(yǔ)言。過去,VisualBasic開發(fā)人員轉(zhuǎn)向使用嚴(yán)格的C++進(jìn)行編碼時(shí),可能比較困難。現(xiàn)在,VisualBasic.NET開發(fā)人員能夠較容易的轉(zhuǎn)向C#,因?yàn)檫@兩種語(yǔ)言之間僅存在較小的語(yǔ)法差別。本書中的代碼是使用C#編寫的。本書的目的

編寫本書的目的是為了滿足游戲開發(fā)群體的需求,他們?nèi)鄙訇P(guān)于本書主題方面的信息。由于不能找到所需要的信息,太多可能成為優(yōu)秀游戲開發(fā)人員的程序員選擇了退出。目前市場(chǎng)上的多數(shù)游戲開發(fā)書籍是關(guān)于2D圖形的,它們是比較好的起點(diǎn),但現(xiàn)在編寫的多數(shù)游戲兒乎全是3D圖形的,并且現(xiàn)在的游戲愛好者也希望如此。并不是不需要繼續(xù)編寫2D游戲,但是如果那是游戲開發(fā)人員所能夠做的所有,則他所做的可能毫無用處。本書并不教導(dǎo)您如何去編寫■?個(gè)價(jià)值數(shù)百萬美元的游戲。而是給出所有的工具和信息,讓讀者自己學(xué)會(huì)如何開發(fā)3D游戲。在閱讀本書的過程中,將實(shí)現(xiàn)兩個(gè)完整的3D游戲,閱讀完本書后,讀者將能夠設(shè)計(jì)并實(shí)現(xiàn)自己的3D游戲,以使自己成為ー?名優(yōu)秀的游戲開發(fā)人員。本書中最后的游戲?qū)⒘艚o讀者作為一個(gè)練習(xí)。作者簡(jiǎn)介TomMiller是ManagedDirectXAPI的設(shè)計(jì)師和首席開發(fā)人員。自1997年開始,他工作于Microsoft公司。他最初在VisualBasic組工作,后來他喜愛上了游戲和游戲編程,因此進(jìn)入了DirectX組。自1999年末,他在DirectX組工作,并且已經(jīng)使得DirectXAPI(和通常的游戲編程)為更多人所接受。他也編寫了到目前為止最具權(quán)威的關(guān)于ManagedDirectX庫(kù)的書籍。歡迎您的寶貴意見!作為本書的讀者,您同時(shí)還是本書最重要的批評(píng)家和評(píng)論員。我尊重您的意見,想知道我們?cè)谑裁吹胤阶龅貌诲e(cuò),在哪些地方還能夠做得更好,您最想看到我們提供哪些方面的內(nèi)容,以及您希望傳遞給我們的任何明智的言語(yǔ)。我們非常歡迎您的評(píng)論。您可以給我們寫電子郵件或者直接給我寫信,闡明您喜歡或不喜歡本書的哪些方面——以及我們能夠在哪些方面改進(jìn)本書。請(qǐng)您注意的是,我們不能在與本書主題相關(guān)的技術(shù)問題方面幫助您。但是,我們擁有一個(gè)用戶服務(wù)小組,與本書相關(guān)的特定技術(shù)問題將轉(zhuǎn)寄給他們。信中務(wù)必包含本書的書名和作者,以及您的姓名、電子郵件地址和電話號(hào)碼。我們將仔細(xì)閱讀您的評(píng)論,并將它們與本書的作者和編輯共享。我的電子郵件地址是:feedback@

信件地址是:MichaelStephensAssociatePublisherSamsPublishing800East96thStreetIndianapolis,IN46240USA讀者服務(wù)關(guān)于本書和Sams出版社的其他更多信息,請(qǐng)?jiān)L問我們的網(wǎng)站http:〃0在搜索框中輸入ISBN號(hào)(不包括連字號(hào))或者書名,就可以查到您想看的書。也可訪問http:〃/downpage/,下載相關(guān)代碼。1.1什么是.NET?如果熟悉了如何利用CLR(公共語(yǔ)言運(yùn)行庫(kù))編寫代碼后,在面臨選擇開發(fā)語(yǔ)言時(shí),您可能已經(jīng)知道了您的選擇。在VisualStudio.NET產(chǎn)品的最新版本中,當(dāng)編寫托管代碼時(shí),可以使用4種語(yǔ)言:C#、VisualBasic.NET、ManagedC++和J#。此外還可以使用從VisualStudio.NET產(chǎn)品之外的第三方銷售商處獲得的其他語(yǔ)言,例如COBOL或者FORTRAN。盡管本書中將討論的概念可以很容易地移植到任何完全兼容CLS(通用語(yǔ)言規(guī)范)的語(yǔ)言,但實(shí)際的代碼將僅包含所提到的前兩種語(yǔ)言:即C#和VisualBasic.NET〇本書中將僅使用C#代碼。您可以從http:〃/downpage中下載本書配套的安裝文件,獲取相關(guān)代碼。在本章中,您將學(xué)習(xí)到:定義.NET托管代碼使用VisualStudio .NETIDE在命令行中編譯托管代碼開發(fā)人員游戲開發(fā)過程工具

什么是.NET?自從Microsoft公司宣布并發(fā)行.NET之后,人們一直在嘗試指出這種新“事物”到底是什么。根據(jù)Microsoft公司的市場(chǎng)活動(dòng),人們知道它將對(duì)計(jì)算產(chǎn)生革命性作用。這是一個(gè)很宏遠(yuǎn)的目標(biāo),現(xiàn)在斷言它是否能夠完成目標(biāo)還太早。但是,它正在ー步步地向此目標(biāo)努力。當(dāng)人們討論.NET時(shí),無法確定他們正在討論.NET的哪個(gè)部分。Microsoft公司發(fā)行的其他“產(chǎn)品”或“思想”都不具有如此多的不同形式。緊隨.NET名字的是眾多的產(chǎn)品、服務(wù),甚至是概念,因此指出.NET實(shí)際上是什么,是非常困難的。當(dāng)本書中討論.NET時(shí),它指從.NETFrameworkSDK中可獲得的新的開發(fā)語(yǔ)言和運(yùn)行庫(kù)。該SDK包含.NET運(yùn)行庫(kù)。而.NET運(yùn)行庫(kù)包含運(yùn)行為.NET環(huán)境編寫的應(yīng)用程序所需要的所有東西??梢哉J(rèn)為.NET運(yùn)行庫(kù)由幾部分組成。CLR的部件駐留在GAC(GlobalAssemblyCache)中。也包括Microsoft.NET語(yǔ)言的編譯器(C#、VB.NET、VJ#等等)??梢栽趫D1-1中看到GAC。圖1-1GAC人們對(duì)運(yùn)行.NET代碼的最常見誤解之一是,代碼是“解釋執(zhí)行的”,像Java代碼或者老的VisualBasic運(yùn)行庫(kù)一樣。事實(shí)上,為.NET編寫的代碼在執(zhí)行前首先被編譯。當(dāng)編譯.NET應(yīng)用程序時(shí),它被編譯為ー種中間語(yǔ)言(IL,intermediarylanguage)〇這種1L實(shí)際上存儲(chǔ)在可執(zhí)行文件中或者已經(jīng)創(chuàng)建的庫(kù)中。IL可能在兩個(gè)位置中的某ー處被編譯為本機(jī)代碼(nativecode)〇在安裝代碼時(shí),可以執(zhí)行?個(gè)稱為ngen(nativegeneration,即本機(jī)生成器)的進(jìn)程。它將!L直接編譯為本機(jī)代碼,并將所編譯的本機(jī)代碼存儲(chǔ)在GAC中的特定位置一

一本機(jī)程序集緩存(nativeassemblycache)中。假設(shè)在安裝時(shí)沒有編譯代碼,則代碼在第一次執(zhí)行前必須被編譯。在應(yīng)用程序啟動(dòng)期間,.NET運(yùn)行庫(kù)中一種稱為JIT(JustInTime)編譯器的特殊功能在后臺(tái)執(zhí)行編譯工作。在后一種情形中,因?yàn)榘l(fā)生在后臺(tái)的編譯工作,應(yīng)用程序的啟動(dòng)時(shí)間將受到影響。當(dāng)啟動(dòng)時(shí)間對(duì)應(yīng)用程序非常重要時(shí)(例如正在編寫游戲時(shí)),確保在安裝階段包含ngen步驟是比較明智的。但是,在這期間無法進(jìn)行某些優(yōu)化,而如果利用JIT編譯代碼,則可以進(jìn)行這些優(yōu)化,因此如果啟動(dòng)時(shí)間不是很重要,則可以讓?NET運(yùn)行庫(kù)處理它所能夠做的工作。什么是托管代碼什么是托管代碼在本書中將經(jīng)常提到托管代碼。在全書中使用的AP!被稱為Managed的DirectX,.NET語(yǔ)言常被稱為托管語(yǔ)言。術(shù)語(yǔ)“托管”來源于.NET運(yùn)行庫(kù)具有一個(gè)內(nèi)置的內(nèi)存管理器這一事實(shí)。在“過去”(只是幾年前),使用C和C++編寫代碼的開發(fā)人員不得不自己進(jìn)行內(nèi)存管理。當(dāng)不再需要已分配的內(nèi)存空間時(shí),必須將其釋放,除非希望該內(nèi)存被“泄漏”,內(nèi)存泄漏將帶來嚴(yán)重的性能問題。更糟糕的是因?yàn)橹苯犹幚碇羔?而它很容易破壞項(xiàng)目正在使用的內(nèi)存。在很多情況下,這將導(dǎo)致很長(zhǎng)時(shí)間的故障調(diào)試,因?yàn)橥ǔ?shí)際看到出錯(cuò)的地方并不是內(nèi)存初始被破壞的地方。人們認(rèn)為C和C++語(yǔ)言難于掌握,主要是因?yàn)榫哂泻芏噙@種類型的問題。許多開發(fā)人員不愿意嘗試C和C++,也是因?yàn)檫@個(gè)原因,他們嘗試使用其他沒有這些令人頭痛問題的高級(jí)語(yǔ)言,例如VisualBasico盡管這些新語(yǔ)言具有易用易學(xué)的優(yōu)點(diǎn),但也具有一些缺點(diǎn)。它們的性能無法與C和C++語(yǔ)言相比,在大多數(shù)情況下顯得特別慢。另外,因?yàn)榈讓硬僮飨到y(tǒng)是使用C++開發(fā)的,所以這些語(yǔ)言難以實(shí)現(xiàn)C++的所有功能。盡管可以使用它們處理很多非常好的工作,但是如果想要獲得操作系統(tǒng)的所有性能和優(yōu)勢(shì),只能依靠自己。與.NET運(yùn)行庫(kù)的第一個(gè)版本相比,.NET的大多數(shù)內(nèi)容都已經(jīng)改變了。Microsoft公司兒乎完全重新設(shè)計(jì)了?種新的API,竭力確保開發(fā)人員關(guān)心的問題都會(huì)

被解決。這種新的運(yùn)行庫(kù)必須易學(xué)易用,快速高效,并且不存在令人頭痛的內(nèi)存管理問題。在本書中,將看到?NET在這些方面的好處使用MicrosoftVisualStudio.NET2003IDE編寫代碼1.3使用MicrosoftVisualStudio.NET2003IDE編寫代碼提示:本書設(shè)定在VisualStudio.NETIDE中編寫代碼。這不是使用.NET編寫游戲的需求,也不是使用.NET本身的需求,它是本書所選擇的IDE。圖1-2顯示了VisualStudio.NET2003IDE。該IDE提供了編寫.NET應(yīng)用程序所需要的所有工具。它不僅包括編寫代碼所需要的編輯器,而且還有其他大量功能,使得.NET應(yīng)用程序的開發(fā)變得容易。它的設(shè)計(jì)使得您能夠方便地創(chuàng)建豐富的內(nèi)容,如Windows應(yīng)用程序。它也具有ー個(gè)內(nèi)置的編譯器和調(diào)試器,并且無縫集成了所有功能。本書設(shè)定使用這種IDE進(jìn)行開發(fā)。

圖1-2VisualStudio.NETIDE熟悉這種IDE的最好方式是使用它編寫ー個(gè)簡(jiǎn)單應(yīng)用程序。典型的計(jì)算機(jī)編程是編寫ー個(gè)簡(jiǎn)單的HelloWorld應(yīng)用程序,該應(yīng)用程序只是在屏幕上輸出HeiloWord文本。老實(shí)說,這非常令人厭煩,因此您應(yīng)當(dāng)嘗試編寫更復(fù)雜的程序。但也不需要奇特的程序,因?yàn)檫@只是對(duì)IDE的ー個(gè)介紹,當(dāng)然在程序中包括一些用戶特性交互將更好。在這里將編寫ー個(gè)應(yīng)用程序,詢問用戶的姓名和出生年份,然后輸出用戶的當(dāng)前年齡。〇#代碼現(xiàn)在啟動(dòng)VisualStudio.NET2003IDE。首次啟動(dòng)時(shí),應(yīng)當(dāng)看到圖1-2所示的默認(rèn)啟動(dòng)頁(yè)面。單擊該頁(yè)中的NewProject按鈕,啟動(dòng)ー個(gè)新的項(xiàng)目。如果沒有顯示這個(gè)頁(yè)面,也可以單擊File|NewProject菜單項(xiàng),或者按下Ctrl+Shift+N快捷鍵。這將產(chǎn)生一個(gè)NewProject對(duì)話框,如圖1-3所示。應(yīng)當(dāng)首先嘗試C#代碼,因此在NewProject對(duì)話框中,從左邊的列表框中選擇VisualC#Projects項(xiàng),從右邊的列表框中選擇ConsoleApplication項(xiàng)。為項(xiàng)目命名,然后單擊0K按鈕創(chuàng)建該項(xiàng)目。這將創(chuàng)建一個(gè)新的控制臺(tái)應(yīng)用程序,當(dāng)前它什么都不執(zhí)行。使用程序清單1.1中的代碼替換自動(dòng)生成的代碼。圖1-3NewProject對(duì)話框程序清單1.1簡(jiǎn)單的C#控制臺(tái)應(yīng)用程序

usingSystem;classConsoleApp{staticvoidMain()(Console.Write("HelloWorldC#!\r\nPleaseenteryourname:");stringname=Console.ReadLine();Console.Write("Hello{〇},pleaseentertheyearyouwereborn:",name);intyear=int.MaxValue;while(year==int.MaxValue)(try(year=int.Parse(Console.ReadLine());)catch(FormatException)(Console.Write("Youdidnotenteravalidnumber.");Console.WriteLine("Pleaseenteraninteger,suchas1975.");))Console.WriteLine("Youmustbeapproximately{0}yearsold!",DateTime.Now.Year-year);Console.WriteLine("Pressthe<Enter>keytoexittheapplication");Console.Read();)

如果您已經(jīng)熟悉了C、C++或者Java,則C#語(yǔ)言的語(yǔ)法與這些語(yǔ)言非常相似。盡管C#的底層運(yùn)行庫(kù)仍然是CLR,但是它的語(yǔ)法源于這些語(yǔ)言,熟悉它們的開發(fā)人員很容易進(jìn)行移植。該代碼根本不復(fù)雜,它在詢問用戶的姓名和出生年份之前,首先使用Console類輸出ー個(gè)簡(jiǎn)單的消息(該消息包含HelloWorld)〇注意,該應(yīng)用程序接著詢問出生的年份,直到用戶輸入ー個(gè)有效的數(shù)值。它最后利用ー個(gè)簡(jiǎn)單的公式輸出用戶的當(dāng)前年齡。圖1-4顯示了該應(yīng)用程序的運(yùn)行過程。Pk皿Mrttr?wrmm:TmllllerhlhI?bNilur,flmuemt?rttewarwr*hn:TUt*aiHmUMF??4UMtMtev?mIMMabtr.Mt?r?? tetbmIE.わ.Hutte2S?Mn.U冷eti?《"e>it?EttheWM—圖1-4第一個(gè)應(yīng)用程序VB.NET代碼如果讀者更熟悉VisualBasic語(yǔ)法,很可能能夠理解前文中的大多數(shù)代碼。這兩種語(yǔ)言的語(yǔ)法差別不是很大,但還是應(yīng)當(dāng)嘗試編寫ー個(gè)VisualBasic.NET版本的應(yīng)用程序。再次啟動(dòng)ー個(gè)新的項(xiàng)目,并采用在C#代碼中所使用的相同指令,其中不同之處是項(xiàng)目的類型。應(yīng)當(dāng)選擇VisualBasicProjects項(xiàng)目,創(chuàng)建該項(xiàng)目后,使用程序清單1.2中的代碼替換自動(dòng)生成的代碼。程序清單1.2簡(jiǎn)單的VB.NET控制臺(tái)應(yīng)用程序ModuleModulelSubMain()Console.Write("HelloWorldC#!"+vbCr+vbLf+"Pleaseenteryourname:")DimnameAsString=Console.ReadLine()

Console.Write("Hello{0},pleaseentertheyearyouwereborn:",name)DimyearAsInteger=Integer.MaxValueWhileyear=Integer.MaxValueTryyear=Integer.Parse(Console.ReadLine())CatchfeAsFormatExceptionConsole.Write("Youdidnotenteravalidnumber.")Console.WriteLine("Pleaseenteraninteger,suchas1975.")EndTryEndWhileConsole.WriteLine("Youmustbeapproximately{0}yearsold!",DateTime.Now.Year-year)Console.WriteLine("Pressthe<Enter>keytoexittheapplication")Console.Read()EndSub'MainEndModule'Modulel如您所見,從C#到VB.NET的代碼移植并不復(fù)雜。因?yàn)檫@兩種語(yǔ)言運(yùn)行于相同的運(yùn)行庫(kù)之上,所以這兩段代碼僅存在微小的語(yǔ)法差別。也應(yīng)當(dāng)注意到,這兩段代碼產(chǎn)生了相同的結(jié)果。這是.NET的ー種強(qiáng)大功能,它允許開發(fā)人員使用他最熟悉的語(yǔ)言編寫代碼。如果使用了編程語(yǔ)言X,您不必?fù)?dān)心不能利用編程語(yǔ)言Z中的功能丫。因?yàn)槊恳环N托管語(yǔ)言使用了相同的底層運(yùn)行庫(kù),它們都具有相似的功能集。在命令行中編譯.NET代碼1.4在命令行中編譯.NET代碼到目前為止,使用VisualStudio.NETIDE是開發(fā).NET應(yīng)用程序最容易的方法,但它并不是僅有的方法。.NET運(yùn)行庫(kù)將C#、VB.NET和VJ#的編譯器隨其

運(yùn)行庫(kù)?起發(fā)布,因此只要有一個(gè)文本編譯器和.NET運(yùn)行庫(kù),就能夠創(chuàng)建任何.NET應(yīng)用程序。提示:為了實(shí)際開發(fā)并使用.NET應(yīng)用程序,需要.NET運(yùn)行庫(kù)。如果沒有安裝,您可以從Microsoft的網(wǎng)站http://www.m/r//net處下載。打開ー個(gè)文本編輯器(例如Notepad),輸入前面某ー個(gè)程序清單中的代碼。保存該代碼,并打開一個(gè)命令提示符。在使用.NET運(yùn)行庫(kù)中的編譯器之前,需要設(shè)置路徑,將其指向底層.NETFramework的位置。在命令窗口中,輸入下面的命令更新路徑:setpath=%path%;C:\WINDOWS\Microsoft.NET\Framework\vl.1.4322警告:如果Windows文件夾不是在C:\windows處,當(dāng)更新路徑變量時(shí),確保輸入了正確的Windows文件夾位置。命令行編譯器位于上文所列出的文件夾中,與一些組成.NET運(yùn)行庫(kù)本身的程序集相同。C#的編譯器是esc.exe,VB.NET的編譯器是vbc.exe。這些可執(zhí)行文件具有相似的命令行參數(shù)集,可以使用單個(gè)參數(shù)/?來顯示這些編譯器的所有參數(shù)。假設(shè)使用了該代碼的C#版本,并將文件保存為classl.cs,可以利用如下命令將應(yīng)用程序編譯為名為app.exe的可執(zhí)行程序。首先定位到代碼文件所在的文件夾,然后運(yùn)行下面的命令:esc/out:app.exe/target:exeClassi.cs輸出應(yīng)當(dāng)類似于下面的內(nèi)容:Microsoft(R)VisualC#.NETCompilerversion7.10.3052.4forMicrosoft(R).NETFrameworkversion1.1.4322Copyright(C)MicrosoftCorporation2001-2002.Allrightsreserved.

現(xiàn)在運(yùn)行該應(yīng)用程序,它將產(chǎn)生與使用IDE作為開發(fā)環(huán)境時(shí)相同的結(jié)果。游戲開發(fā)簡(jiǎn)述游戲開發(fā)簡(jiǎn)述在2001年,視頻游戲的收入首次超過了電影工業(yè)的票房收入。該產(chǎn)業(yè)欣欣向榮,并需大量?jī)?yōu)秀的開發(fā)人員。如果ー個(gè)公司能夠在某個(gè)頂級(jí)游戲中花費(fèi)上百萬美元,那他們很自然地會(huì)對(duì)游戲開發(fā)團(tuán)隊(duì)非常挑剔。本章將討論游戲開發(fā)的過程和制作這些偉大游戲的團(tuán)隊(duì)。開發(fā)人員1.6開發(fā)人員在最近幾年中,作為DirectX組的ー員,我非常高興能夠與大量的游戲開發(fā)人員ー起討論問題。盡管每一個(gè)開發(fā)人員都是獨(dú)特的,但是他們具有相似的特征。其中最顯然的特征之一是他們都絕對(duì)喜愛游戲。當(dāng)然,這是可以預(yù)料的。游戲開發(fā)是ー項(xiàng)艱苦的工作,它時(shí)間長(zhǎng)、任務(wù)緊,壓力大。那些不具有獻(xiàn)身游戲精神的人應(yīng)當(dāng)去編寫沒有這些壓カ的軟件。盡管目前對(duì)于ー個(gè)游戲工作室來說,宣布在開發(fā)游戲中的花費(fèi)是不常見的,但是許多游戲在開發(fā)期間花費(fèi)了上百萬美元,這是公司發(fā)行游戲的真實(shí)投資。許多游戲需要多年的開發(fā),這需要對(duì)游戲本身和開發(fā)人員、藝術(shù)家、設(shè)計(jì)人員以及任何參與制作的人員具有絕對(duì)的信心。很多時(shí)候,發(fā)行商屈服于壓カ,并在游戲準(zhǔn)備好之前就發(fā)行。另外一種情形就像DukeNukemForever(3DRealms所發(fā)行的一款游戲)該游戲的開發(fā)時(shí)間超過了5年,發(fā)行商直到它最終完成オ發(fā)行?;氐揭曨l游戲開發(fā)的早期(古老的拱廊和Atari家庭系統(tǒng)),游戲通常由一個(gè)或兩個(gè)人編寫,編寫時(shí)間是幾周而不是幾年。由此可以看到當(dāng)今的視頻游戲世界的巨大進(jìn)步?;氐侥菚r(shí)您可以制作一個(gè)非常簡(jiǎn)單的游戲,例如Galaga,它只有ー個(gè)級(jí)別,玩家只能反復(fù)地在該級(jí)別中進(jìn)行游戲。它的圖形簡(jiǎn)單,但非常有趣并

且令人著迷。它的編寫困難嗎?任何曾經(jīng)看到該游戲的開發(fā)人員應(yīng)當(dāng)認(rèn)識(shí)到它非常容易編寫。相反,當(dāng)今的游戲功能非常巨大,必須設(shè)計(jì)、開發(fā)龐大的世界,并且創(chuàng)建一些藝術(shù)資產(chǎn)。大多數(shù)游戲包含多個(gè)級(jí)別和非常復(fù)雜的玩法,而不是早期游戲中所看到的向前向后移動(dòng)并開火。所有這些先進(jìn)的特性需要越來越多的開發(fā)時(shí)間,并且由于當(dāng)今游戲玩家期望這些先進(jìn)的特征,所以任何大預(yù)算的項(xiàng)目似乎都不可能在短短的兒周內(nèi)完成。當(dāng)今的大游戲也對(duì)游戲開發(fā)人員的繁榮添加了一層復(fù)雜性,因?yàn)椴东@大眾注意的游戲不再可能由個(gè)人完成。實(shí)際上個(gè)人(甚至是ー個(gè)小組)也不可能將所編寫的游戲放到貨架上出售,因?yàn)橛?jì)算機(jī)軟件商店銷售游戲的開銷是非常高的。大多數(shù)游戲開發(fā)初學(xué)者將他們編寫的游戲作為共享軟件發(fā)行,甚至是免費(fèi)軟件。有大量的網(wǎng)站為共享游戲開發(fā)作貢獻(xiàn),該團(tuán)體由其他許多游戲開發(fā)人員組成,他們提供有價(jià)值的反饋、測(cè)試和論壇,在論壇中可以展示新思想以及炫耀您的最新創(chuàng)作。初學(xué)的游戲開發(fā)人員不可能通過創(chuàng)建這些小的共享游戲變得富有,但卻使得他們能夠開發(fā)重要的“樣片(dem。reel)”,在大預(yù)算項(xiàng)目中申請(qǐng)ー個(gè)游戲開發(fā)位置時(shí),可以使用這些樣片。正如引言中提到的ー樣,本書將引導(dǎo)您學(xué)習(xí)開發(fā)ー個(gè)高性能、完全3D的游戲所需要的技能,使得您在某一天能夠開發(fā)自己的樣片。在這之前,您需要詢問自己:準(zhǔn)備好成為一個(gè)游戲開發(fā)人員了嗎?并詢問自己以下兒個(gè)問題:您喜歡玩視頻游戲嗎?您是否曾經(jīng)沉迷于游戲而忘記了時(shí)間?您常常在思考這些世界是如何創(chuàng)建的嗎?您是否相信自己具有能夠轉(zhuǎn)換為下ー個(gè)偉大視頻游戲的構(gòu)想?您對(duì)當(dāng)今存在的所有相同的老游戲感到厭煩了嗎?您有關(guān)于重新定義流行視頻游戲的構(gòu)想嗎?您希望我閉嘴,并馬上告訴您如何編寫自己的視頻游戲嗎?

如果您對(duì)這些問題中的一個(gè)或多個(gè)回答了“是”,則表示您非常渴望成為一名游戲開發(fā)人員?;蛟S您已經(jīng)具有某些構(gòu)想,但不具備將頭腦中的構(gòu)想通過代碼轉(zhuǎn)化為實(shí)際游戲能力。本書將通過實(shí)際的游戲編程快速教會(huì)您這些技能。游戲開發(fā)過程1.7游戲開發(fā)過程所有的游戲開始時(shí)都只是ー個(gè)構(gòu)想。如果沒有構(gòu)想,能編寫什么呢?如果只是隨機(jī)的編碼,能夠希望它在未來成為ー個(gè)偉大的作品嗎?盡管這對(duì)抽象畫家的工作可能有效,但軟件開發(fā)人員不能在沒有計(jì)劃的情況下做任何事情。但是,只有構(gòu)想,并不意味著可以開始編寫代碼。我曾經(jīng)看到(并且將不斷看到)的最大的錯(cuò)誤是,開發(fā)人員提前進(jìn)行代碼的編寫。除非代碼非常簡(jiǎn)單,不用動(dòng)任何腦筋,那么您可以立即開始編寫代碼,否則在只有一個(gè)構(gòu)想的情況下就開始編寫代碼,決不是好的做法。在沒有計(jì)劃的情況下開始編寫代碼,所帶來的只是更大的工作量、更多的反復(fù)編碼以及更長(zhǎng)的開發(fā)時(shí)間。在編寫代碼之前,應(yīng)當(dāng)開發(fā)ー個(gè)設(shè)計(jì)規(guī)范。該文檔應(yīng)當(dāng)包含關(guān)于如何設(shè)計(jì)代碼、對(duì)象如何交互和對(duì)象可能具有的各種屬性的特定信息。如果沒有這ー步就直接編碼,在大多數(shù)情況下將導(dǎo)致解決錯(cuò)誤的問題。即使您能夠快速的解決這些問題,但是如果沒有解決正確的問題,工作就是毫無意義的。結(jié)果將會(huì)花費(fèi)更多的時(shí)間為真正的問題尋找解決方案。您也應(yīng)當(dāng)花ー些時(shí)間將構(gòu)想記錄到紙上(或者計(jì)算機(jī)文件中)。如果不想讓您關(guān)于下ー個(gè)偉大的計(jì)算機(jī)游戲的構(gòu)想非常含糊,以至于設(shè)計(jì)規(guī)范無法描述需要求解哪些問題,那么您最好確保您的構(gòu)想是生動(dòng)的。將構(gòu)想展示給朋友,讓他們提問題,并確保這些問題能夠在您的文檔中得到回答。如果您的構(gòu)想類似于“編寫ー個(gè)令人恐怖的第一人射手游戲”,那么說明您還沒有很好地思考您的構(gòu)想。玩家具有什么類型的武器?可以獲得什么類型的游戲模式?支持多人游戲嗎?在采取進(jìn)一步的行動(dòng)之前,您需要很好地思考您的構(gòu)想。

如果您正在嘗試為發(fā)行商開發(fā)游戲,那么也需要開發(fā)?個(gè)游戲建議。盡管將這??建議寫入文檔是非常重要的,但在大多數(shù)情形下,更需要?個(gè)足夠好的演示片段。如果只是基于ー個(gè)構(gòu)想,發(fā)行商通常不會(huì)將項(xiàng)目交給您(除非您在游戲開發(fā)方面已經(jīng)具有很大名氣,如果是這樣,您將不需要學(xué)習(xí)本書)。工具工具編寫偉大的游戲并不只是編寫好的代碼。當(dāng)然這并不表示代碼的編寫不重要,在創(chuàng)建這些游戲時(shí),還需要考慮其他大量因素。所有游戲開發(fā)都需要一個(gè)好的工具集。當(dāng)今的大多數(shù)游戲(即使是嚴(yán)格的2D游戲)都有大量的藝術(shù)成份,這些藝術(shù)成份是采用3D模型軟件包開發(fā)的。這些工具對(duì)于參與游戲開發(fā)的藝術(shù)家來說是無價(jià)的,它們使得浮現(xiàn)在腦海里的構(gòu)想成為現(xiàn)實(shí)。盡管在本書中并不討論如何創(chuàng)建所需要的藝術(shù),但會(huì)提到使用的工具。當(dāng)今所使用的兩種非常流行的數(shù)字內(nèi)容生成工具是Maya和3DStudioMAX,分別如圖1-5和圖1-6所示。但是,創(chuàng)建藝術(shù)并不只是3D建模。即使一個(gè)模型由上百萬個(gè)多邊形組成,如果沒有紋理的話,看上去也是很乏味的。很多工具可以用于創(chuàng)建紋理,例如Photoshop(如圖1-7所示)和Paint(在安裝Windows時(shí)附帶安裝了Paint,如圖1-8所示)。6K圖1-5使用Maya建模?個(gè)宇宙も船圖1-6使用3DStudioMAX建模ー個(gè)妖怪圖1-7使用Photoshop創(chuàng)建紋理圖!-8使用Paint創(chuàng)建紋理開發(fā)和藝術(shù)加工工具都是非常好的工具,您將在游戲開發(fā)中使用到它們。還有一些其他類型的工具也非常重要,但很多人甚至沒有考慮到它們,例如一個(gè)優(yōu)秀的源碼控制管理工具。

假設(shè)您的游戲具有聲音,那么您很可能需要用于處理聲音文件的工具??梢允褂肳indows附帶的SoundRecorder(如圖1-9所示),也可以使用比較復(fù)雜的WaveStudio,它是CreativeLab的音頻軟件的一一部分(如圖1T0所示)。圖1-9使用SoundRecorder圖!-10使用CreativeLab的WaveStudio利用所有這些工具為游戲創(chuàng)建內(nèi)容,您可能需要一個(gè)能夠?yàn)檎麄€(gè)團(tuán)隊(duì)存儲(chǔ)內(nèi)容的工具。很可能有大量的信息需要存儲(chǔ),以及定期備份。最好是只備份新更改和添加的記錄。大多數(shù)源碼控制管理工具至少提供其中某個(gè)功能。VisualStudio中的VisualSourceSafe是ー個(gè)簡(jiǎn)單的源碼控制管理工具,它適用于小的團(tuán)隊(duì)。該工具不包含大型團(tuán)隊(duì)所需要的許多強(qiáng)大功能,例如允許多人操作一個(gè)文件和自動(dòng)合并相互沖突的改變等功能,但是對(duì)于ー個(gè)小團(tuán)隊(duì)中的小項(xiàng)目來說,它通常能夠滿足需要。還有大量其他的源碼控制工具(例如Perforce),因此您需要

做ー個(gè)小的調(diào)査,找出哪種工具適合您和您的小組。當(dāng)然,使用任何ー一種工具都比沒有工具強(qiáng)。小結(jié)1.9小結(jié)本章主要介紹了.NET的基礎(chǔ)知識(shí)。相信您已經(jīng)對(duì).NET和托管代碼有大致的了解,并且采用兩種語(yǔ)言編寫了一個(gè)簡(jiǎn)單的應(yīng)用程序。您也學(xué)習(xí)了如何在集成開發(fā)環(huán)境之外編譯這些應(yīng)用程序。至此,已經(jīng)介紹了如何開始進(jìn)行游戲開發(fā)的相關(guān)基礎(chǔ),并且介紹了游戲的開發(fā)人員、開發(fā)過程以及游戲開發(fā)所需要的某些商業(yè)エ〇第2章中將介紹游戲開發(fā)相關(guān)的內(nèi)容。提出游戲構(gòu)想通過第1章的簡(jiǎn)短介紹后,現(xiàn)在開始本書的正題:3D游戲編程。顯然,這個(gè)主題非常復(fù)雜,雖然您的第一個(gè)游戲無法發(fā)行,但是它將幫助您了解游戲開發(fā)基本原則。將游戲構(gòu)想轉(zhuǎn)換為實(shí)際的程序,是您所能夠獲得的最好體驗(yàn)。將大腦中的構(gòu)想轉(zhuǎn)換為其他人能夠欣賞的實(shí)際內(nèi)容,是所有開發(fā)人員的目標(biāo),但當(dāng)這些構(gòu)想與游戲相關(guān)時(shí),回報(bào)似乎更大,而您肯定期望更大的回報(bào)。在本章中,將學(xué)習(xí):提出游戲構(gòu)想2D和3D編程差別細(xì)化規(guī)范提出游戲構(gòu)想所有的事物都起始于構(gòu)想,游戲也不例外。游戲構(gòu)想可以源于您思考的任何方面?;蛟S您看到您所喜愛的其他游戲,但是您認(rèn)為如果在某些方面作一些變化,它將會(huì)更好?;蛟S您做了一個(gè)夢(mèng),它能夠轉(zhuǎn)換為ー個(gè)極好的游戲?;蛟S您意識(shí)到

兩個(gè)不相關(guān)的游戲能夠組合在ー?起,從而創(chuàng)建一個(gè)極佳的游戲。無論您的靈感源于哪里,在您開始制造游戲之前,都需要這樣的靈感。不幸的是,由于還沒有人發(fā)明一本能夠閱讀思想的書,在本書的示例游戲中您只能相信我的思想。本書之所以選擇這些游戲,原因有很多,主要考慮到開發(fā)的難度。但是,每ー個(gè)例子都分屬不同的類型,它們覆蓋了游戲開發(fā)過程中遇到的大量不同主題。第一種類型的游戲是拼圖游戲(puzzlegame)〇您很可能看到過或玩過拼圖游戲。Tetris是ー個(gè)典型的拼圖游戲,兒乎每個(gè)人都曾經(jīng)聽過,甚至因?yàn)橥孢@款游戲而廢寢忘食。似乎每個(gè)人也都編寫過Tetris游戲,因此您很可能不愿意選擇它作為您即將編寫的拼圖游戲。另外Tetris是ー個(gè)2D游戲(盡管已經(jīng)存在3D類型的Tetris游戲),因此,您也很可能希望跳過它。取而代之的是,您應(yīng)當(dāng)編寫稍微具有特色的游戲。該游戲基于ー個(gè)面板。該面板由?系列的立方體組成,每個(gè)立方體處于ー種未確定模式,并且每個(gè)立方體至少與一個(gè)其他立方體直接相鄰。棋盤是滿足這些標(biāo)準(zhǔn)的ー個(gè)面板例子。其中每個(gè)立方體具有一種特定的顏色,當(dāng)玩家走到某個(gè)立方體上時(shí),它將變?yōu)榱硗庖环N預(yù)定顏色。在某ー級(jí)別中,當(dāng)每個(gè)立方體處于正確的顏色時(shí),該級(jí)別結(jié)束。細(xì)化提議正如第1章所介紹的ー樣,一旦游戲的基本構(gòu)想已經(jīng)建立,您應(yīng)當(dāng)花費(fèi)ー些時(shí)間討論游戲的各種提議,以確保您的思考足夠全面。對(duì)于這個(gè)游戲,下面是有助于細(xì)化提議的ー個(gè)列表:稱為Blockers的拼圖游戲只支持單個(gè)玩家完全3D環(huán)境得分基于完成一個(gè)級(jí)別所使用的時(shí)間每個(gè)級(jí)別由一系列相鄰的立方體組成,例如一個(gè)棋盤每個(gè)立方體ー種顏色

在某個(gè)級(jí)別中,當(dāng)每個(gè)立方體顏色相同,并且是該級(jí)別預(yù)定的、、終止”顏色時(shí),該級(jí)別結(jié)束每個(gè)級(jí)別有一個(gè)最大時(shí)間限制每個(gè)立方體有一個(gè)顏色列表——最少包括兩種顏色,最多包括六種顏色玩家通過在立方體上''跳動(dòng)"來進(jìn)行游戲,跳動(dòng)時(shí)將立方體的顏色改變?yōu)榱斜碇邢漏`種顏色起始級(jí)別中,每個(gè)立方體的顏色列表有兩種顏色在更高級(jí)別中,每個(gè)立方體的顏色列表將具有更多的顏色,因此游戲的難度增加如果玩家能夠完成這些級(jí)別,則允許顏色列表返回初始狀態(tài),來增加游戲的難度如果玩家不能在最大時(shí)間限制內(nèi)完成游戲,則游戲結(jié)朿這個(gè)列表描述了游戲的每個(gè)特征嗎?很可能沒有,但是它回答了在策劃游戲之前需要回答的主要問題。策劃階段并不是對(duì)游戲的每個(gè)功能進(jìn)行細(xì)化,在您開始開發(fā)之前理解這…點(diǎn)是非常重要的,但是更需要您思考游戲需要的特征。在不考慮實(shí)際需要的功能的情況下就提前投入并編碼,將導(dǎo)致后面的工作更困難,以至于您可能需要補(bǔ)充某些遺失的內(nèi)容,或者因?yàn)轸斆У挠?jì)劃而導(dǎo)致工作完全錯(cuò)誤。根據(jù)計(jì)劃,現(xiàn)在您可以開始設(shè)計(jì)游戲中使用的對(duì)象模型。對(duì)象圖并不復(fù)雜。您具有神秘的游戲引擎,它保存了關(guān)于玩家、當(dāng)前級(jí)別和繪圖設(shè)備(renderingdevice)的信息。繪圖設(shè)備用于將游戲的圖形顯示在顯示器上。玩家需要某種類型的可視化表示,繪圖設(shè)備將處理這些。該游戲的大多數(shù)地方需要當(dāng)前級(jí)別的信息。當(dāng)前時(shí)間非常重要,因?yàn)樗糜诖_定玩家的分?jǐn)?shù)和游戲結(jié)束時(shí)間(如超時(shí),游戲即結(jié)束),因此當(dāng)前級(jí)別必須訪問它。實(shí)際的級(jí)別存儲(chǔ)在文件系統(tǒng)中,位于應(yīng)用程序的媒體目錄中。因?yàn)楫?dāng)前級(jí)別需要加載ー個(gè)已經(jīng)存在的級(jí)別,所以它也需要訪問這些信息。級(jí)別需要記錄的信

息是組成級(jí)別的立方體列表。每一個(gè)級(jí)別需要至少兩個(gè)立方體,但是可以添加更多的立方體以滿足更高的級(jí)別。該游戲并不容易編寫,但是它并不需要?jiǎng)?chuàng)建多個(gè)對(duì)象確保滿足游戲的目標(biāo)。該游戲也非常好玩,只要更難的級(jí)別不會(huì)難到讓玩家無法完成。一個(gè)游戲決不能夠讓玩家感到苦惱。如果游戲不好玩,則沒有人會(huì)玩,該游戲也不可能成功。理解ー個(gè)3D游戲的需求2.2理解ー個(gè)3D游戲的需求認(rèn)識(shí)到這個(gè)游戲(實(shí)際上任何游戲都是這樣)不需要?jiǎng)?chuàng)造為完全3D的世界,是非常重要的??紤]到您的顯示器很可能是一個(gè)矩形的平板,最終3D圖形將顯示在ー個(gè)2D平面上。創(chuàng)建一個(gè)2D組圖(sprite)的集合,該集合將覆蓋每ー種可能的場(chǎng)景,但是這種情況下所需要的藝術(shù)資產(chǎn)是巨大的。查看下面的例子。假設(shè)已經(jīng)安裝了DirectXSDKSummer2004Update,請(qǐng)加載DirectXSampleBrowser(圖2T),確保Managed選項(xiàng)是左邊被選中的惟ー項(xiàng)。單擊Direct3D標(biāo)題,向下尋找EmptyProject項(xiàng),并單擊InstallProject鏈接,遵循向?qū)У牟襟E創(chuàng)建項(xiàng)目(將該項(xiàng)目命名為“Teapot”)。項(xiàng)目創(chuàng)建后,將其加載到IDE中。圖2-1DirectXSampleBrowser

這將創(chuàng)建一個(gè)新的“空”項(xiàng)目(它實(shí)際上生成了某些用戶界面控件,但是現(xiàn)在,那些都被忽略)。但是,該項(xiàng)目中還不存在任何3D,由于這個(gè)練習(xí)的目的是演示為什么希望編寫3D游戲,所以最好添加?些內(nèi)容。在這個(gè)項(xiàng)目中添加少量的代碼,生成一個(gè)慢速旋轉(zhuǎn)的茶壺。您要添加兒行代碼,使得該應(yīng)用程序能夠進(jìn)行圖形繪制,在本章中不對(duì)這些代碼功能進(jìn)行解釋。在本書的后面將給出大量的篇幅解釋這些代碼,但對(duì)于目前的演示來說,它們不是必需的。假設(shè)您將項(xiàng)目命名為“Teapot”,打開代碼文件teapot,cs并將下面兩個(gè)變量添加到這個(gè)類文件中:privateMeshteapotMesh=null;//MeshforrenderingtheteapotprivateMaterialteapotMaterial;//Materialforrenderingtheteapot現(xiàn)在創(chuàng)建茶壺和用于繪制場(chǎng)景的材質(zhì),找到該類中的OnCreateDevice方法,將下面的代碼添加到該方法的結(jié)尾處://CreatetheteapotmeshandmaterialteapotMesh=Mesh.Teapot(device);teapotMaterial=newMaterial。;teapotMaterial.DiffuseColor=newColorValue(1.0f,l.Of,l.Of,l.Of);為了使茶壺更真實(shí),還需要光照效果(這些會(huì)在本書的后面詳細(xì)解釋)。找到類中的OnReseDevice

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論