基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文

上傳人:沈*** 文檔編號(hào):86685755 上傳時(shí)間:2022-05-08 格式:DOC 頁數(shù):27 大?。?63.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文_第1頁
第1頁 / 共27頁
基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文_第2頁
第2頁 / 共27頁
基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文_第3頁
第3頁 / 共27頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文》由會(huì)員分享,可在線閱讀,更多相關(guān)《基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)論文(27頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、基于VC的飛行模擬游戲的設(shè)計(jì)及實(shí)現(xiàn) 摘 要 電子游戲的出現(xiàn)代表了一種全新娛樂方式的誕生。目前,電子游戲正以其獨(dú)特的魅力吸引著眾多的玩家。隨著游戲產(chǎn)業(yè)的蓬勃發(fā)展,越來越多的人加入到了游戲開發(fā)的行業(yè)。游戲開發(fā)涵蓋了程序設(shè)計(jì)、文學(xué)、歷史、音樂及美術(shù)等諸多方面的容,除去市場(chǎng)價(jià)值的意義,電子游戲的發(fā)展的必要性還在于對(duì)我國(guó)文化產(chǎn)業(yè)的發(fā)展的重要性,游戲作為一種特殊的創(chuàng)意文化產(chǎn)品形態(tài),是文化產(chǎn)業(yè)鏈中不可缺少的一環(huán)。設(shè)計(jì)在利用已有的開發(fā)包和已有的游戲框架的基礎(chǔ)上,采用Microsoft Visual C++2005為開發(fā)平臺(tái),這些開發(fā)包和框架已經(jīng)完美地解決了游戲圖像和音效方面的問題,設(shè)計(jì)的主要工作就是向框

2、架中添加自己所設(shè)計(jì)的類,用于實(shí)現(xiàn)設(shè)計(jì)所要實(shí)現(xiàn)的功能。在進(jìn)行類的設(shè)計(jì)時(shí),運(yùn)用C++所具有的繼承和派生功能,使很大一部分代碼能夠得到重用,從而實(shí)現(xiàn)多態(tài),同時(shí),還要在父類中很好地引入虛函數(shù),為指針能夠指向子類的同名成員提供方便,然后利用開發(fā)包里的方法來實(shí)現(xiàn)游戲背景的顯示,最終得到一個(gè)在Microsoft Visual C++2005上運(yùn)行的飛行模擬游戲,同時(shí)在運(yùn)行時(shí)不會(huì)出現(xiàn)重大尤其是會(huì)令游戲崩潰的BUG。 關(guān)鍵詞:飛行模擬;多態(tài);代碼重用 Design and realization of a flight simulation g

3、ame based on VC Abstract The appearance of computer game has represented the naissance of a totally new sort way of entertainment. At present, the computer game has attracted a great deal of players by its unique charm. Along with the game industry flourishing, more and more people has joined the

4、profession of game development. Game development has covered many contents including programming, literature, history, music, arts ,etc. Eliminate the significance of market value, game develop is quite important to the culture evolution of our nation to be a special kind of creativityculture produc

5、tion.Game is indispensable to the chain of culture industry. The design based on the develop package and the game frame which already exist usesMicrosoft Visual C++2005 to be the platform.These develop package and game frame has raveled out the problem which relate to image and sound effect perfectl

6、y.The main task of the design is to add classes that planed by oneself to the game frame, to actualize the function which the design have to realize. When we carry through the classes design, use the inherit and derive function,we need to enable a majority of code can be reused, aim toactualizepolym

7、orphism, at the same time.It is necessary to use virtual function in the baseclass, to make pointer can point to the member which has the same name in the subclass more convenience, afterwards, utilize the develop package to realize the demonstration of game background, finally obtain a flight simul

8、ation game which can run on Microsoft Visual C++2005, and there’s no seriously bugs especially that can make the game crash when running. Key words:flight simulation; polymorphism; code reuse 26 / 27 目錄 論文總頁數(shù):26頁 1引言1 1.1課題背景1 1.2國(guó)外研究背景1 1.3本課題研究的意義1 1.4本課題研究的方法1 2游戲軟件的現(xiàn)狀和VC的概況1 2.1中國(guó)游戲軟件

9、的現(xiàn)狀1 2.2C++簡(jiǎn)介2 2.3Microsoft Visual C++簡(jiǎn)介3 2.4利用Visual C++開發(fā)游戲簡(jiǎn)介3 3開發(fā)環(huán)境介紹3 3.1開發(fā)環(huán)境3 3.2關(guān)于Allegro4 4游戲程序的開發(fā)4 4.1游戲的思路和構(gòu)想4 4.1.1 游戲想法的產(chǎn)生4 4.1.2 對(duì)游戲設(shè)計(jì)的初步認(rèn)識(shí)4 4.1.3 模塊成型階段4 4.2程序的類結(jié)構(gòu)5 4.3游戲的實(shí)現(xiàn)5 4.3.1 主類Level的實(shí)現(xiàn)5 4.3.2 Object類的實(shí)現(xiàn)11 4.3.3 Plane類的實(shí)現(xiàn)12 4.3.4 Player類的實(shí)現(xiàn)14 4.3.5 Enemy類的實(shí)現(xiàn)15 4

10、.3.6 Bullet類的實(shí)現(xiàn)16 4.3.7 Prize類的實(shí)現(xiàn)17 5程序設(shè)計(jì)過程中遇到的一些重要問題18 5.1關(guān)于碰撞的問題18 5.2關(guān)于游戲畫面的問題21 5.3關(guān)于玩家控制的問題23 結(jié)論24 參考文獻(xiàn)24 致25 聲明26 1 引言 1.1 課題背景 現(xiàn)今,游戲軟件已經(jīng)成為盈利最高的軟件之一,而且還在向著復(fù)雜化、大型化發(fā)展,其中,很多由Visual C++作為開發(fā)工具的游戲都取得了巨大的成功,比如暴雪公司的《魔獸爭(zhēng)霸》系列和《魔獸世界》,這說明Visual C++開發(fā)游戲具有一定的優(yōu)勢(shì)。所以,在Visual C++平臺(tái)上設(shè)計(jì)游戲是極為方便的,

11、這也是優(yōu)勢(shì)所在。 1.2 國(guó)外研究背景 無論是在國(guó)還是國(guó)外,游戲編程已經(jīng)成為了一種時(shí)尚,許多程序員都忘我地投入到其中,他們其中有很多人不光是為了盈利,也有很多是純粹為了興趣,許多著名的游戲編程員本身就是狂熱的游戲玩家,所以,無論是國(guó)還是國(guó)外,誕生了很多經(jīng)典的游戲,其中利用Visual C++作為開發(fā)平臺(tái)的更是不勝枚舉,但是由于我國(guó)的游戲編程相對(duì)于國(guó)外起步較晚,所以在很多地方還存在不小的差距,甚至成了很多游戲軟件業(yè)比較發(fā)達(dá)的國(guó)家的游戲加工廠。 1.3 本課題研究的意義 目前,市面上的游戲可以說是層出不窮,并且隨著電腦硬件系統(tǒng)的改良,未來的游戲必將更智能化,更藝術(shù)化,更人性化,在高性能的硬

12、件設(shè)備支持下,游戲的驅(qū)動(dòng)引擎更具威力,控制功能更加完備,給人們帶來更豐富的娛樂和體驗(yàn),好的游戲給人們的生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受,潛默的教育功效,時(shí)尚的情感冶,如果沒有足夠的優(yōu)質(zhì)游戲,那么市場(chǎng)就不免會(huì)被粗劣的游戲充斥,可以說,對(duì)于青少年來說,誰對(duì)游戲編程有著更深入的理解和掌握,誰就掌握著游戲的導(dǎo)向權(quán)。 1.4 本課題研究的方法 采用Microsoft Visual C++2005為開發(fā)平臺(tái),在利用已有的開發(fā)包和已有的游戲框架的基礎(chǔ)上,這些開發(fā)包和框架已經(jīng)完美地解決了游戲圖像和音效方面的問題,設(shè)計(jì)的主要工作就是添加自己所設(shè)計(jì)的類,用于實(shí)現(xiàn)本設(shè)計(jì)所要實(shí)現(xiàn)的功能,在進(jìn)行類的設(shè)計(jì)時(shí),

13、運(yùn)用C++所具有的繼承和派生功能,使很大一部分代碼能夠得到重用,同時(shí),還要在父類中很好地引入虛函數(shù),為指針能夠子類的同名成員提供方便,最后利用開發(fā)包里的方法來實(shí)現(xiàn)一個(gè)游戲背景的顯示。 2 游戲軟件的現(xiàn)狀和VC的概況 2.1 中國(guó)游戲軟件的現(xiàn)狀 軟件產(chǎn)業(yè)是當(dāng)前世界上增長(zhǎng)最快的產(chǎn)業(yè)之一,并將成為21世紀(jì)推動(dòng)世界經(jīng)濟(jì)發(fā)展和社會(huì)進(jìn)步的重要?jiǎng)恿?。近年?主要國(guó)家軟件業(yè)平均以11%以上的增長(zhǎng)率快速發(fā)展。據(jù)"oecd20XX信息技術(shù)展望"報(bào)告,1997年,其增長(zhǎng)率成員國(guó)僅軟件包產(chǎn)值就占世界市場(chǎng)份額的94%,達(dá)1080億美元,并自1990年以來年11.2%。美國(guó)是世界上最大的軟件生產(chǎn)國(guó),1997年的軟件

14、產(chǎn)值為1705.9億美元,占其當(dāng)年GDP的2.1%,出口額為155.5億美元。日本其次,1998年軟件產(chǎn)值約570億美元,但出口僅為0.82億美元。英國(guó)列第三,1999年的軟件產(chǎn)值為377.46億美元,占其GDP的1.2%,出口約16.2億美元。據(jù)對(duì)各國(guó)軟件業(yè)發(fā)展的軌跡分析,雖然各國(guó)的產(chǎn)業(yè)規(guī)模和出口額相差較大,但其成功的因素可歸納為以下幾點(diǎn):1. 對(duì)軟件知識(shí)產(chǎn)權(quán)的嚴(yán)格保護(hù),營(yíng)造一種誰投資誰受益的良好商業(yè)和法治氛圍; 2. 服務(wù)到位的融資機(jī)構(gòu),促進(jìn)軟件成果轉(zhuǎn)化快; 3. 高素質(zhì)的軟件專業(yè)人才,配合制定靈活的技術(shù)移民政策; 4. 具有第一流的大學(xué)教育,能夠迅速適應(yīng)市場(chǎng)對(duì)人才的需求; 5. 發(fā)達(dá)的通

15、信設(shè)施; 6. 長(zhǎng)期磨煉的企業(yè)家精神; 7. 巨大的市場(chǎng)需求。 相比于其他國(guó)家,我國(guó)的軟件產(chǎn)業(yè)特別是游戲產(chǎn)業(yè)起步較晚,在很多地方上都不及一些軟件大國(guó),但是近年來我國(guó)軟件業(yè)發(fā)展迅速,有關(guān)統(tǒng)計(jì)數(shù)據(jù)顯示,20XX,軟件產(chǎn)業(yè)銷售收入僅為796億元,到了20XX年底已經(jīng)達(dá)到4800億元,5年增長(zhǎng)了6倍多。但與軟件產(chǎn)業(yè)發(fā)達(dá)國(guó)家相比,差距依然很大,絕大部分市場(chǎng)被國(guó)外軟件業(yè)巨頭壟斷,國(guó)產(chǎn)軟件占據(jù)的市場(chǎng)份額很少。在國(guó)際市場(chǎng)上,20XX國(guó)產(chǎn)軟件出口額為35.9億美元,僅占全球軟件市場(chǎng)份額的5.9%。 2.2 C++簡(jiǎn)介 C++語言是在C語言的基礎(chǔ)上為支持面向?qū)ο蟮某绦蛟O(shè)計(jì)而研制的通用程序設(shè)計(jì)語言,它是由A

16、T&T貝爾實(shí)驗(yàn)室的Bjarne Stroustrup博士創(chuàng)建。研制C++的首要目標(biāo)是使C++首先是一個(gè)更好的C語言,所以根除了C語言中存在的問題,增加了許多新功能。C++的另一個(gè)目標(biāo)是支持面向?qū)ο蟮某绦蛟O(shè)計(jì),因此在C++中引入了類的機(jī)制。所研制的這個(gè)語言最初被稱為"帶類的C語言",1983年取名為C++。C++語言的標(biāo)準(zhǔn)化工作從1989年開始,于1994年制定了ANSI C++標(biāo)準(zhǔn)草案。 C++的主要特點(diǎn)有兩個(gè)方面:全面支持C語言與面向?qū)ο?。C++從C語言發(fā)展而來,保持了C語言的簡(jiǎn)潔、高效和在某些操作上沿用了匯編語言指令的特點(diǎn)。同時(shí),對(duì)C語言的類型進(jìn)行了系統(tǒng)的改革和擴(kuò)充,堵塞了C語言中的許多

17、漏洞,C++編譯提供了更好的類型檢查和編譯時(shí)的分析,能檢查出更多的類型錯(cuò)誤。C++改善了C語言的安全性,比C語言更安全。由于C++保持與C語言兼容,這就使許多代碼不經(jīng)修改就可在C++編譯器下通過,用C語言編寫的眾多庫函數(shù)和實(shí)用軟件可方便地移植到C++中。因此,使用C語言的程序員能很快學(xué)會(huì)C++,使用C++進(jìn)行編程。另外,用C++編寫的程序可讀性好,代碼結(jié)構(gòu)更為合理。C++的最重要的特點(diǎn)是支持面向?qū)ο蟮某绦蛟O(shè)計(jì),使用C++編程,編程效率高;由于面向?qū)ο蟮姆椒ǜ咏祟愓J(rèn)識(shí)世界的方法,C++對(duì)于問題更容易描述,程序更容易理解與維護(hù);C++的模板對(duì)庫代碼的重用提供了支持;C++更有利于大型程序設(shè)計(jì)。

18、C++是一種支持多種程序設(shè)計(jì)方法的語言,提供對(duì)過程化和基于對(duì)象的程序設(shè)計(jì)方法的支持。適合于不同使用開發(fā)方法的編程人員。 2.3 Microsoft Visual C++簡(jiǎn)介 Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的 Windows 平臺(tái)應(yīng)用程序開發(fā)環(huán)境。目前已經(jīng)開發(fā)到 8.0 版本,也就是 Visual Studio 2005。在Visual Studio中就有面向 Windows 開發(fā)使用的 Visual C++。 Visual C++自誕生以來,一直是Windows環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一。Visual C++不僅是C++語言的集成開發(fā)環(huán)境,而且與Wi

19、n32緊密相連,所以,利用Visual C++開發(fā)系統(tǒng)可以完成各種各樣的應(yīng)用程序的開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,Visual C++強(qiáng)大的調(diào)試功能也為大型復(fù)雜軟件的開發(fā)提供了有效的排錯(cuò)手段。 進(jìn)入21世紀(jì)以來,隨著多媒體技術(shù)和圖像技術(shù)的不斷發(fā)展,可視化技術(shù)得到廣泛的重視,越來越多的計(jì)算機(jī)專業(yè)人員和非專業(yè)人員都開始研究并應(yīng)用可視化技術(shù)。所謂可視化技術(shù),一般是指軟件開發(fā)階段的可視化和對(duì)計(jì)算機(jī)圖形技術(shù)和方法的應(yīng)用。Visual C++是一個(gè)很好的可視化編程工具,使用Visual C++環(huán)境來開發(fā)基于Windows的應(yīng)用程序大大縮短了開發(fā)時(shí)間,而且它的界面更友好,便于程序員操作。

20、 2.4 利用Visual C++開發(fā)游戲簡(jiǎn)介 進(jìn)入上個(gè)世紀(jì)90年代以來,游戲開發(fā)進(jìn)入了可視化階段,并且Visual C++是首選的開發(fā)工具,在此期間,誕生了許多用Visual C++開發(fā)的經(jīng)典游戲,比如任天堂公司Family Computer主機(jī)上的《小蜜蜂》以及大名鼎鼎的《星際爭(zhēng)霸》,這些游戲不僅在當(dāng)時(shí)取得了巨大的成功,而且到現(xiàn)在也被奉為經(jīng)典??梢哉f在這個(gè)時(shí)期,Visual C++在游戲開發(fā)領(lǐng)域是獨(dú)領(lǐng)風(fēng)騷。 進(jìn)入了新千年,JAVA語言開始崛起,由于JAVA具有較高的可移植性,許多游戲,特別是很多手機(jī)游戲都轉(zhuǎn)向了JAVA平臺(tái),但是縱觀市面上最火的單機(jī)游戲《魔獸爭(zhēng)霸3》和最火的網(wǎng)絡(luò)游戲《

21、魔獸世界》,都清一色的是用Visual C++開發(fā)的,這說明就算在新時(shí)期的游戲開發(fā)中, 利用Visual C++作為開發(fā)平臺(tái)還是具有一定優(yōu)勢(shì)的。 3 開發(fā)環(huán)境介紹 3.1 開發(fā)環(huán)境 操作系統(tǒng):Microsoft Windows XP 程序語言:C++ 開發(fā)平臺(tái):Visual C++ 2005 開發(fā)工具:Allegro 3.2 關(guān)于Allegro Allegro是一個(gè)免費(fèi)為C和C++的開發(fā)人員提供的一個(gè)游戲編程庫,它支持以下操作系統(tǒng):DOS, Unix , Windows, QNX, BeOS和MacO

22、S X。它還提供了很多諸如圖形,聲音,玩家輸入<鍵盤,鼠標(biāo)和手柄>和定時(shí)器的功能。它也提供了浮點(diǎn)運(yùn)算功能,3D功能,文件管理功能和GUI。當(dāng)前最新版本為4.3.1,官方網(wǎng)址為 4 游戲程序的開發(fā) 4.1 游戲的思路和構(gòu)想 4.1.1 游戲想法的產(chǎn)生 資料顯示,在上個(gè)世紀(jì)風(fēng)靡一時(shí)的任天堂FC主機(jī)上,最火爆的飛行游戲便是《小蜜蜂》,這款游戲已其獨(dú)特的游戲方式征服了億萬玩家,這款游戲的游戲方式雖然極為簡(jiǎn)單,但是卻極為有趣,停留在屏幕上方的蜜蜂不停地向下攻擊玩家所控制的飛機(jī),玩家不僅必須要避開蜜蜂的攻擊,還要控制飛機(jī)還擊蜜蜂而玩家擊中這些蜜蜂以后,他們死亡后會(huì)有一定幾率掉落增加玩家生命,玩家子

23、彈速度和玩家得分的獎(jiǎng)子,而這款《小蜜蜂》,正是用C++語言開發(fā)的,這說明,在Visual C++平臺(tái)下開發(fā)一個(gè)類似于《小蜜蜂》的飛行射擊游戲是可行的。 4.1.2 對(duì)游戲設(shè)計(jì)的初步認(rèn)識(shí) 整個(gè)設(shè)計(jì)的關(guān)鍵詞如下:游戲、飛機(jī)、敵機(jī)、子彈、關(guān)卡、玩家、獎(jiǎng)子、屏幕、三發(fā)子彈、雙發(fā)子彈、改變玩家子彈類型變化的獎(jiǎng)子、增加玩家生命的獎(jiǎng)子、爆炸,這些關(guān)鍵字都需要定義一個(gè)獨(dú)立的類來描述它們,并且,可以把飛機(jī)類設(shè)定為敵機(jī)類和玩家類的父類,因?yàn)轱w機(jī)類中的一些方法也可以用于敵機(jī)類和玩家類,同理,也應(yīng)該把獎(jiǎng)子類設(shè)定為改變玩家子彈類型變化的獎(jiǎng)子類和增加玩家生命的獎(jiǎng)子類的父類,至于子彈,則不必用到繼承和派生,因?yàn)闊o論

24、是三發(fā)子彈還是雙發(fā)子彈,他們的屬性和功能都是一樣的,差別只是存在于視圖上。 4.1.3 模塊成型階段 進(jìn)一步熟悉了編程知識(shí)后,對(duì)框架做出了一些修改,逐步把游戲的基本功能確定。 1.Level類主要實(shí)現(xiàn)負(fù)責(zé)管理游戲中的所有物體,包括管理顯示,碰撞,創(chuàng)建和回收等,還提供了一些服務(wù),方便查詢關(guān)卡中的一些物體的信息。 2.Object類主要負(fù)責(zé)控制可見性,坐標(biāo)位置,設(shè)置速度等,其中就主要的一個(gè)功能就是判斷物體是否越界。 3.Plane類主要就是實(shí)現(xiàn)設(shè)定飛機(jī)的爆炸類型,子彈類型,實(shí)現(xiàn)開火以及設(shè)定開火冷卻時(shí)間,而其子類Enemy類則進(jìn)一步實(shí)現(xiàn)了設(shè)定敵機(jī)的生命值和掉落的獎(jiǎng)子類型。另一個(gè)子類Pl

25、ayer類增加了實(shí)現(xiàn)玩家在被擊毀后誕生時(shí)的無敵時(shí)間。 4.Bullet類主要實(shí)現(xiàn)了子彈的創(chuàng)造。 5.Explosion類主要實(shí)現(xiàn)了爆炸的創(chuàng)造。 6.Prize類主要實(shí)現(xiàn)玩家"吃"掉獎(jiǎng)子后改變玩家屬性。 4.2 程序的類結(jié)構(gòu) 圖1 游戲類結(jié)構(gòu)圖 4.3 游戲的實(shí)現(xiàn) 4.3.1 主類Level的實(shí)現(xiàn) Level類是最核心的類,他實(shí)現(xiàn)了最初關(guān)卡的創(chuàng)建,最終關(guān)卡的銷毀,并實(shí)現(xiàn)了檢測(cè)碰撞,為Object類里的物體實(shí)現(xiàn)碰撞提供了接口,同時(shí),Level類中的兩個(gè)方法getNearestEnemy和getNumCompanies則為敵機(jī)對(duì)玩家實(shí)行攻擊策略提供了函數(shù),最后,玩家"吃"掉獎(jiǎng)子后

26、生命增加和得分增加的函數(shù)實(shí)現(xiàn)也包含在Level類中,所謂關(guān)卡,就必須要有一定的運(yùn)行狀態(tài),關(guān)卡運(yùn)行有三種狀態(tài),可以定義一個(gè)枚舉類型來定義三個(gè)不同的狀態(tài),這里用到枚舉類型的原因是,關(guān)卡運(yùn)行的狀態(tài)只有運(yùn)行,結(jié)束和失敗三種,只有有限的幾種可能值,雖然可以用int, char等類型來表示他們,但是對(duì)數(shù)據(jù)的合法性檢查卻是一件很麻煩的事情,而C++中的枚類型就是專門來解決這類問題的 typedef enum Status //關(guān)卡狀態(tài)定義一個(gè)名為Status的枚舉類型 { LEVEL_END, //關(guān)卡結(jié)束 LEVEL_FAILED,

27、 //關(guān)卡失敗 LEVEL_RUN, //關(guān)卡運(yùn)行 }; 同時(shí),在游戲運(yùn)行中會(huì)發(fā)生不同的事件,也需要一一定義,由于游戲事件較多,同理,也需要定義一個(gè)枚舉類型來定義眾多的事件 enum Event { E_RenewPlayer,//! 創(chuàng)建玩家,關(guān)閉所有事件 E_ReadyDelay,//! 顯示‘ready’前的等待,并啟動(dòng)E_Ready 事件 E_Ready,//! 顯示‘ready’,啟動(dòng)E_RenewPlayer 事件

28、 E_LevelEnd,//! 使關(guān)卡處于完成狀態(tài),表示通關(guān) E_LevelFailed,//! 使關(guān)卡處于失敗狀態(tài) E_LevelFailedDelay,//! 關(guān)卡失敗前的等待,并啟動(dòng)E_LevelFailed 事件 E_LevelEndDelay,//! 關(guān)卡通關(guān)前的等待,并啟動(dòng)E_LevelEnd 事件 }; 接下來,我們所要做的,便是創(chuàng)建關(guān)卡,從關(guān)卡文件中讀入物體數(shù)據(jù),創(chuàng)建物體并加入到關(guān)卡中 bool create

29、 *kb>; 在關(guān)卡最初創(chuàng)建時(shí),需要把敵機(jī)數(shù)目設(shè)置為0,把關(guān)卡狀態(tài)設(shè)置為運(yùn)行,同時(shí)應(yīng)該關(guān)閉定時(shí)器。接著就是使用io包的ReadFile創(chuàng)建對(duì)象rf,方便讀取文件,以實(shí)現(xiàn)關(guān)卡中敵機(jī)的初始化,由于IO包不透明,所以無法了解其部是如何實(shí)現(xiàn)這一功能的,在此,只能列出在文本中的格式,格式如下: 視圖 獎(jiǎng)子 爆炸 子彈 體力 坐標(biāo)X 坐標(biāo)Y 策略號(hào) 視圖有兩種:編號(hào)1表示使用第一個(gè)敵機(jī)圖片,編號(hào)2表示使用第二個(gè)敵機(jī)圖片;獎(jiǎng)子有四種:編號(hào)0表示沒有獎(jiǎng)子,編號(hào)1表示獎(jiǎng)一個(gè)生命的獎(jiǎng)子,編號(hào)2表示獎(jiǎng)勵(lì)三發(fā)子彈武器的獎(jiǎng)子,編號(hào)3表示獎(jiǎng)勵(lì)20分的獎(jiǎng)子;爆炸有三種:編號(hào)0表示小型爆炸,編號(hào)1表示普通爆炸,編號(hào)2表

30、示大型爆炸;子彈有四種:編號(hào)0表示小單發(fā)子彈,編號(hào)1表示雙發(fā)子彈,編號(hào)2表示三發(fā)子彈,編號(hào)3表示反彈型單發(fā)子彈,編號(hào)4表示高速雙發(fā)子彈;體力的數(shù)值就表示可以被攻擊多少次;坐標(biāo)的兩個(gè)數(shù)值即為敵機(jī)在關(guān)卡中的坐標(biāo)位置。 比如說,要設(shè)置一個(gè)使用第一敵機(jī)圖片,掉落一個(gè)獎(jiǎng)勵(lì)20分的獎(jiǎng)子,爆炸類型為普通爆炸,發(fā)射小單發(fā)的子彈,可被攻擊1次,坐標(biāo)為60 80的敵機(jī),那么就在文本文件中輸入1 3 1 0 1 60 80 由于這里涉及設(shè)備層中的資源管理器,提供加載圖片和聲音的服務(wù)以及設(shè)備層中的鍵盤,提供輸入查詢,具體的實(shí)現(xiàn)將放到重要問題說明中詳細(xì)介紹。 關(guān)卡創(chuàng)建完畢,就應(yīng)該向其中添加我們想要的東西,并使其工

31、作 void Level::add //向關(guān)卡里添加敵機(jī)的實(shí)現(xiàn) { int id = o->getRuntimeClassID<>;//獲取物體運(yùn)行時(shí)的類ID if //如果物體是敵機(jī),增加敵機(jī)數(shù)目 { mNumEnemies++; } 在這里向關(guān)卡中添加敵機(jī)時(shí)先要判斷當(dāng)前被添加物體是否為敵機(jī),如果是才添加,如果不是,則不添加。 敵機(jī)添加完畢就需要?jiǎng)?chuàng)建玩家,玩家的位置是固定的,把玩家的坐標(biāo)位置設(shè)置為:X軸坐標(biāo)設(shè)置為當(dāng)前關(guān)卡X軸的二分之一,Y軸坐標(biāo)設(shè)置為當(dāng)前關(guān)卡Y軸最大值減20 p->s

32、etPos <&Vector>; 要添加,就必須要移出,所以相應(yīng)的,也就有摧毀物體,比如在關(guān)卡結(jié)束后,我們需要摧毀關(guān)卡中所有的資源,所以我們定義一個(gè)destroy方法,摧毀關(guān)卡中的所有物體,釋放資源給資源管理器,比如圖片和聲音 void destroy ; 同時(shí),關(guān)卡還需要處理玩家或者敵機(jī)的死亡,我們定義一個(gè)processDie的方法來實(shí)現(xiàn),流程如下 圖2 處理飛機(jī)死亡流

33、程 其中在判斷物體的類別,并且完成玩家和或者敵機(jī)的死亡后繼續(xù)判斷玩家的生命是否用盡和敵機(jī)數(shù)目是否為0,這樣做的目的是為了避免在玩家和最后一個(gè)敵機(jī)同歸于盡的時(shí)候依然進(jìn)入關(guān)卡結(jié)束事件。 而update方法算是Level類中比較關(guān)鍵的方法,他更新關(guān)卡中的所有物體,包括檢測(cè)碰撞,更新定時(shí)器,處理碰撞等,其中最主要的方法便是物體的越界處理,首先計(jì)算物體的坐標(biāo)與關(guān)卡邊緣是否發(fā)生相交,其中判斷是否在X軸越界的算法為:取出物體的坐標(biāo),判斷其是否小于關(guān)卡的坐標(biāo)X1或者其是否大于關(guān)卡的坐標(biāo)X2,若滿足一項(xiàng)時(shí),則調(diào)用Object類中的onOutOfArea方法,實(shí)現(xiàn)每個(gè)物體不停的越界實(shí)現(xiàn),流程圖如下 開始

34、 取出當(dāng)前物體的坐標(biāo) 是否大于關(guān)卡坐標(biāo)X2 或者小于關(guān)卡坐標(biāo)X3 通知物體做越界處理 結(jié)束開始 圖 3 判斷物體是否在X軸上越界流程 其中,關(guān)于檢測(cè)物體碰撞由于是本設(shè)計(jì)的重點(diǎn)和難點(diǎn),將放在后面的重要說明中具體說明。 關(guān)卡還需要實(shí)現(xiàn)兩個(gè)方法,那就是getNearestEnemy和getNumCompanies,它們主要是用來實(shí)現(xiàn)敵機(jī)的攻擊策略的,這里首先要聲明一下,當(dāng)玩家,敵機(jī)和獎(jiǎng)子類被創(chuàng)建時(shí),都會(huì)獲取一個(gè)ID,以表明其身份,同樣的,凡是通過這幾個(gè)類創(chuàng)建的對(duì)象也具有與其所屬類相同的ID,通過這樣的方法,就可以把關(guān)卡中眾多的物

35、體相互之間區(qū)分開。 getNearestEnemy主要是實(shí)現(xiàn)敵機(jī)將離其最近的玩家作為目標(biāo),以實(shí)現(xiàn)跟蹤策略,其基本思想是,以當(dāng)前物體作為中心,對(duì)整個(gè)關(guān)卡中的物體進(jìn)行一個(gè)遍歷,若它們同為敵機(jī),則繼續(xù),若它們一個(gè)為玩家,一個(gè)為敵機(jī),則計(jì)算出與其的距離,選出其中與自己距離最小的物體,判斷其是否小于最小距離,若小于,則把當(dāng)前物體鎖定為自己的目標(biāo),流程如下 圖4 鎖定最近敵人的流程 getNumCompanies方法主要是用于給敵機(jī)策略提供一個(gè)接口,它是基于這樣一個(gè)想法,那就是當(dāng)敵機(jī)總

36、數(shù)大于一個(gè)數(shù)值時(shí),敵機(jī)不會(huì)做出任何攻擊動(dòng)作,而當(dāng)玩家消滅一定數(shù)量后,敵機(jī)便會(huì)實(shí)行攻擊策略,getNumCompanies就是讓敵機(jī)獲取當(dāng)前敵機(jī)總數(shù),當(dāng)其返回值小于一定的值時(shí)便執(zhí)行攻擊策略,實(shí)現(xiàn)的方法仍然是對(duì)以當(dāng)前所指向的物體為中心進(jìn)行遍歷,若被遍歷到的物體與其為同一隊(duì)伍且同為敵機(jī)或玩家,則同伴數(shù)目增加1,最開始時(shí),同伴數(shù)目設(shè)置為0,流程如下 圖5 取得同伴數(shù)目流程 此外,關(guān)卡還需要管理增加玩家生命和得分,用于實(shí)現(xiàn)玩家"吃"掉獎(jiǎng)子后的屬性改變,分別定義為addPlayerLife和addScore方法實(shí)現(xiàn),實(shí)現(xiàn)方法為他們

37、實(shí)現(xiàn)自加即可。 4.3.2 Object類的實(shí)現(xiàn) Object類主要管理物體的可視性,速度,以及判斷設(shè)置物體的隊(duì)伍和判斷隊(duì)伍是否一樣等,他抽象了所有的物體,也就是說,其中所有的屬性和方法是一切物體都具有的,這樣做是為了增加代碼的重用量,這也是運(yùn)用C++開發(fā)游戲的好處之一,但是,這樣做就要求把Object類的析構(gòu)函數(shù)設(shè)為虛函數(shù),這是因?yàn)槿绻粚⑽鰳?gòu)函數(shù)設(shè)為虛函數(shù)的話,那么當(dāng)用一個(gè)Object類的指針刪除一個(gè)其子類的對(duì)象時(shí),子類的析構(gòu)函數(shù)就不會(huì)被調(diào)用,雖然這樣做并沒有什么實(shí)際意義,但是這卻符合用C++進(jìn)行軟件開發(fā)的時(shí)候一般用來做基類的類的析構(gòu)函數(shù)設(shè)為虛函數(shù)的默認(rèn)規(guī)定,因此,需要將析構(gòu)函數(shù)設(shè)

38、為虛函數(shù)。 此外,還有幾個(gè)方法是需要重點(diǎn)提及的: ObjectTracer* setTracer是設(shè)置越界處理器,這個(gè)處理器將處理物體的越界事件 ObjectTracer* setTracer //指針指向新的越界處理器 { ObjectTracer* old = mTracer; mTracer = tr; return old; //返回舊的越界處理器 } setDirection是用來設(shè)置物體的移動(dòng)方向,這個(gè)方向?yàn)橛脕硇薷奈矬w的當(dāng)前運(yùn)動(dòng)速度 void setDirection

39、tor* dir> //指針指向新方向向量 { Vector* vel = getVelocity<>; dir->normalize <>;// 單位化這個(gè)向量 vel->multiply

;// 應(yīng)用這個(gè)向量到速度上 } onOutOfArea方法是為了實(shí)現(xiàn)物體越界的處理函數(shù),將任務(wù)代理給mTrancer處理,這樣實(shí)現(xiàn)了ObjectTracer接口的類都可以處理物體的越界 void onOutOfArea //onX 為真的話表示在X軸上越界,否則在Y軸上 { if

40、 mTracer->onOutOfArea ; } 通過這樣的方法,在前面提及的Level類中的update方法就可以成功地實(shí)現(xiàn)越界處理。 另外,顧名思義,所謂Object類,肯定是要設(shè)定所有物體的屬性的,這些屬性包括是否可見Visible,是否可碰撞Collidable,物體所屬隊(duì)伍號(hào)Team,設(shè)置位置setPos和獲取位置getPos,設(shè)定速度setVelocity和獲取速度getVelocity,需要說明的是,這里的速度不是普通的標(biāo)量,而是一個(gè)矢量,即它是有方向的,這樣做的好處就是由于飛機(jī)是只能向前開火,并且其面朝的方向應(yīng)該和其速度的方向一致,那么如

41、何來實(shí)現(xiàn)這兩點(diǎn)呢?這就需要把速度設(shè)置為一個(gè)矢量,這樣一來,就可以把飛機(jī)的開火方向和面朝方向與速度方向取一致。 4.3.3 Plane類的實(shí)現(xiàn) Plane類是Object類的子類,它通過Object類公有繼承而來,所以,凡是Object類中有的方法和屬性,它也具有,當(dāng)然,我們必須為起添加新的函數(shù)或者數(shù)據(jù),那么飛機(jī)相對(duì)于其他物體特有的屬性是什么呢?對(duì),那就是它們死亡的時(shí)候會(huì)發(fā)生爆炸,它們也能發(fā)射子彈,而每種飛機(jī)所產(chǎn)生的爆炸類型和所發(fā)射的子彈類型都是不同的,所以,我們?cè)赑lane類中就設(shè)定幾個(gè)方法來設(shè)定物體的爆炸類型,所發(fā)射的子彈類型以及他們的速度 飛機(jī)的死亡會(huì)產(chǎn)生爆炸,同時(shí)也會(huì)變得不可見

42、 void Plane::die//死亡的實(shí)現(xiàn) { Object *obj = mEF->create ; if { obj->setPos getPos<>>; mLevel->add ; } disappear <>; } 凡是玩過飛機(jī)游戲的人都知道,飛機(jī)是不能連續(xù)發(fā)射子彈的,在兩次發(fā)射子彈之間,必須要有一定的冷卻時(shí)間,,而這個(gè)功能是由Plane類的一個(gè)update方法實(shí)現(xiàn),思路為:對(duì)每一個(gè)飛機(jī)都設(shè)定一個(gè)定時(shí)器CoolTimer,初始值為10,然后不斷對(duì)它進(jìn)行

43、檢查,只要它的值不為0,就進(jìn)行自減,如果某個(gè)飛機(jī)有開火請(qǐng)求的話,就檢查定時(shí)器的值是否為0,如果為0,則允許開火,同時(shí)定時(shí)器的值復(fù)位為初值,如果定時(shí)器的值不為0,則開火請(qǐng)求無效,流程如下: 圖6 飛機(jī)開火冷卻流程 同時(shí),由于假定飛機(jī)只能向前運(yùn)動(dòng),而不能向后運(yùn)動(dòng),所以飛機(jī)的朝向向量也就必須和它的速度向量一致,在前面已經(jīng)介紹過,在設(shè)定Object類中設(shè)定了物體的速度為矢量,這樣就可以把飛機(jī)的朝向向量與其速度矢量取一致了 if ->length<>>// 如果物體有速度,那么物體的朝向向量就根據(jù)他的速度來進(jìn)行調(diào)整 {

44、 mFaceDirection.scale<0>; mFaceDirection.add >; mFaceDirection.normalize <>; } Object::update<>; } 此外還有一個(gè)問題,那就是本游戲假定的是所有飛機(jī)都只能向前方發(fā)射子彈,所以在發(fā)射子彈的實(shí)現(xiàn)中,就必須把子彈的方向與飛機(jī)所面對(duì)的方向取一致,同樣的,也只需要把子彈的方向與飛機(jī)的速度方向取一致就可以了 void Plane::fire <> { Bullet* b = mBF->create

45、, getTeam<>>; if return; b->setPos >; b->setDirection <&mFaceDirection>; //將子彈的方向與飛機(jī)面朝的方向取一致 mLevel->add ; } 4.3.4 Player類的實(shí)現(xiàn) Player類主要實(shí)現(xiàn)了玩家的一些方法,它繼承了飛機(jī)類的所有參數(shù)和方法,玩家和敵機(jī)除了操作不一樣以外,其余的屬性基本一致,比如說,玩家一樣有開火的冷卻時(shí)間,另外,為了和所有已有的飛行游戲接軌,需要將玩家剛誕生時(shí)的一段時(shí)間設(shè)為無敵時(shí)間,即在這段時(shí)間,所有敵機(jī)的

46、攻擊都對(duì)玩家無效,而且,照以往飛行游戲的慣例,在這段無敵時(shí)間,玩家是在不停閃爍的,為此,我們?cè)O(shè)定為其無敵時(shí)間為100,再取名一個(gè)為MatchlessTimer的定時(shí)器,讓其不停自減,當(dāng)減為0時(shí),無敵效果取消,那么,如何實(shí)現(xiàn)玩家的閃爍呢?其實(shí)所謂"閃爍",意思就是其可視性在不停地變化,在這100時(shí)間,不停地對(duì)其視圖可視性取非運(yùn)算,以實(shí)現(xiàn)其閃爍的效果,當(dāng)無敵時(shí)間耗盡時(shí),只需要干兩件事:第一,取消玩家無敵狀態(tài),通過設(shè)置玩家Collidable屬性為真實(shí)現(xiàn);第二,取消玩家的閃爍,通過設(shè)置玩家Visible屬性為真實(shí)現(xiàn)。 關(guān)于玩家的控制,將在后面的重要問題中說明。 4.3.5 Enemy類的實(shí)現(xiàn)

47、 Enemy類主要實(shí)現(xiàn)的功能是設(shè)定敵機(jī)的生命值,設(shè)定掉落獎(jiǎng)子類型,其他一些行為全部由父類Plane繼承而來,但是對(duì)于update這個(gè)方法,Enemy類進(jìn)行了重寫,目的就是為了實(shí)現(xiàn)在不同時(shí)間敵機(jī)采用不同的攻擊策略來攻擊玩家,我們現(xiàn)在設(shè)定敵機(jī)每5個(gè)周期就執(zhí)行一次攻擊策略,那么如何實(shí)現(xiàn)敵機(jī)每5個(gè)周期就更新一次其攻擊策略呢?這同樣需要設(shè)置一個(gè)定時(shí)器UpdateAITimer來實(shí)現(xiàn),首先設(shè)置UpdateAITimer的初值為0,然后對(duì)它進(jìn)行自加,同時(shí)對(duì)UpdateAITimer的值進(jìn)行檢查,當(dāng)它的值為5的倍數(shù)時(shí),敵機(jī)的攻擊策略就進(jìn)行更新,再進(jìn)一步,如何判斷UpdateAITimer的值是否為5的倍數(shù)呢

48、?當(dāng)然通過把 UpdateAITimer的值對(duì)5取余,當(dāng)?shù)玫降闹档扔?時(shí),UpdateAITimer的值即為5的倍數(shù),敵機(jī)的攻擊策略也就進(jìn)行相應(yīng)的更新。 那敵機(jī)的攻擊策略由誰負(fù)責(zé)管理?所有敵機(jī)的攻擊策略都是由AI指針管理,在關(guān)卡剛創(chuàng)建時(shí),AI指針指向的是DefaultAI,這時(shí)敵機(jī)的攻擊策略是不作出任何動(dòng),作在敵機(jī)執(zhí)行DefaultAI時(shí),他會(huì)調(diào)用Level中的getNumCompanies方法,當(dāng)返回值小于最小友軍數(shù)目時(shí),它便會(huì)調(diào)用Level中的getNearestEnemy方法,它的目的是尋找是否有玩家,若玩家已被擊毀,則執(zhí)行DefaultAI,停止任何動(dòng)作,如果玩家仍然存在,那么就把玩

49、家的坐標(biāo)取出,與自己的坐標(biāo)相減,算出距離,若距離小于最小距離mMinDist,則實(shí)施隨機(jī)開火策略,開火幾率是1%到100%之間的一個(gè)隨機(jī)數(shù),流程如下: 圖7 敵機(jī)攻擊策略更新流程 那么,如何保證開火幾率為0%至100%之間的一個(gè)隨機(jī)數(shù)呢?這就要通過一個(gè)隨機(jī)數(shù)rnd來實(shí)現(xiàn),把它的值設(shè)為rand<>%100,這樣就保證rnd總是小于100了。 4.3.6 Bullet類的實(shí)現(xiàn) Bullet類主要實(shí)現(xiàn)的就是子彈的創(chuàng)造了銷毀,以及設(shè)定子彈與飛機(jī)的碰撞,它也是Object類的子類,繼承了Objec

50、t類的所有屬性和方法,其中,子彈都是由子彈工廠BulletFct創(chuàng)造的,也是由其銷毀的,子彈共有3種,同前面介紹的一樣,為了方便,可以定義一個(gè)枚舉類型來描述它 typedef enum BulletType { BT_NORMAL, BT_DOUBLE, BT_THREE, }; 接下來,就要?jiǎng)?chuàng)建子彈,但是由于BulletFct不知道是要?jiǎng)?chuàng)建哪種子彈,所以在創(chuàng)建子彈的時(shí)候,需要一條switch語句來判斷所要?jiǎng)?chuàng)建子彈的類型,共有3種子彈類型,所以switch語句就應(yīng)該有3

51、種case,分別對(duì)每一種子彈進(jìn)行相應(yīng)的視圖創(chuàng)建。 在這里有一個(gè)問題,那就是BulletFct一次性地創(chuàng)建了200個(gè)子彈,如果不對(duì)其進(jìn)行回收,這就勢(shì)必會(huì)大大增加了系統(tǒng)的開銷,導(dǎo)致運(yùn)行速度的緩慢,如何解決著一問題呢?可以創(chuàng)建一個(gè)"池子",創(chuàng)建的所有子彈都先放入這個(gè)池子中,當(dāng)飛機(jī)開火需要子彈時(shí),再從池中取出子彈供其使用,同理,當(dāng)關(guān)卡中有不用的子彈時(shí),也放入池中以供以后使用,這樣就大大增強(qiáng)了資源的重利用,也節(jié)省了許多不必要的系統(tǒng)開銷,這個(gè)表的主要思想是:存放一群物體。根據(jù)物體的使用情況,存放到兩個(gè)表。一個(gè)表存放所有物體,另外一個(gè)表存放無效的物體。當(dāng)用戶需要物體時(shí),從無效的物體表取給用戶。當(dāng)用戶用完后

52、回收時(shí),存放這個(gè)物體到無效物體表以供下次使用,流程如下: 圖8 子彈調(diào)用和回收流程 在本游戲中,所有的子彈只能是直線向上或者向下運(yùn)動(dòng),所以它的更新方法比較簡(jiǎn)單,只需要先判定子彈是否誕生,如果誕生的話,就取出它的坐標(biāo)以及它的速度向量,然后以其速度向量為方向?qū)ζ渥鴺?biāo)作加。 4.3.7 Prize類的實(shí)現(xiàn) Prize類和Bullet類似,也是Object類的子類,它的主要功能是實(shí)現(xiàn)獎(jiǎng)子的創(chuàng)建和銷毀,以及設(shè)定和玩家的碰撞行為,獎(jiǎng)子一共有3種,但是我們把沒有獎(jiǎng)子也算成一種,所以共有4種獎(jiǎng)子,同樣用一個(gè)枚舉類型來定義它 typed

53、ef enum PrizeType { BT_NO, //沒有獎(jiǎng)子 BT_LIFE, //增加玩家生命的獎(jiǎng)子 BT_THREE_BULLET, //子彈變?yōu)槿l(fā)的獎(jiǎng)子 BT_SCORE, //增加玩家得分的獎(jiǎng)子 }; 獎(jiǎng)子都是由PrizeFct創(chuàng)建的,3種不同的獎(jiǎng)子的創(chuàng)建方法是不同的,所以,也需要一條switch語句來分別實(shí)現(xiàn)4種〔其實(shí)只有3種,因?yàn)闆]有獎(jiǎng)子是不需要?jiǎng)?chuàng)建任何東西的〕不同獎(jiǎng)子的創(chuàng)建。 在本游戲中,子彈的更新方法只是與子彈類似,也同樣是取出它的坐標(biāo)以及它的速度向量,然后以其速

54、度向量為方向?qū)ζ渥鴺?biāo)作加。 那么獎(jiǎng)子如何實(shí)現(xiàn)改變玩家的相關(guān)屬性的呢?為了實(shí)現(xiàn)不同獎(jiǎng)子改變玩家不同屬性,我們又用 Prize類派生出3個(gè)子類:AddLifePrize 類,ChangeBulletPrize類和ScorePrize類,分別用來實(shí)現(xiàn)增加玩家生命值,改變玩家子彈和增加玩家得分,以AddLifePrize 類舉例,它增加玩家的生命就通過調(diào)用Level類中的addPlayerLife函數(shù)實(shí)現(xiàn) void AddLifePrize::changeAttribute//增加玩家生命的實(shí)現(xiàn) { mLevel->addPlayerLife <>; } 同樣,C

55、hangeBulletPrize類改變玩家子彈通過調(diào)用Player類中的SetBulletType函數(shù)來實(shí)現(xiàn) void ChangeBulletPrize::changeAttribute //改變玩家子彈類型的實(shí)現(xiàn) { p->setBulletType ; } ScorePrize類增加玩家得分通過調(diào)用Level類中的addScore來實(shí)現(xiàn) void ScorePrize::changeAttribute//增加玩家得分 { mLevel->addScore ; } 5 程序設(shè)計(jì)過程中遇到的

56、一些重要問題 5.1 關(guān)于碰撞的問題 碰撞檢測(cè)問題是本程序的難點(diǎn)和重點(diǎn),也是所有飛行射擊游戲的難點(diǎn)和重點(diǎn),所謂碰撞檢測(cè),就是指檢測(cè)在某一時(shí)刻是否有2個(gè)或者以上的碰撞矩形相交。那么我們首先要做的就是設(shè)定一個(gè)物體的碰撞矩形,具體做法為,在PlaneView中以此物體視圖的中心為點(diǎn),上,下,各取視圖高度的一半,左,右各取視圖寬度的一半,然后調(diào)用Object類中的setCollShape方法來設(shè)定其碰撞矩形 void PlaneView::changeShape { float w = m_plane->getW<>, h = m_plane->getH <>

57、; obj->setCollShape <&Rect<-w/2,-h/2, w/2, h/2>>; } 雖然給物體的碰撞矩形設(shè)定完畢了,但是我們?cè)O(shè)想一下,當(dāng)物體開始移動(dòng)時(shí),也就是視圖開始移動(dòng),但是它的碰撞矩形卻還留在原地,這顯然會(huì)造成碰撞檢測(cè)不能正確地完成,如何解決呢? virtual void update { mNewShape = mCollShape; mNewShape.translate <&mPos>;//將碰撞矩形移動(dòng)到物體的當(dāng)前坐

58、標(biāo)上 }; 接下來,我們所要做的就是進(jìn)行碰撞檢測(cè),這個(gè)方法是由Level類實(shí)現(xiàn)的,先從一個(gè)物體A開始,若A被設(shè)定為不能碰撞,則繼續(xù)從下一個(gè)物體開始,若A能發(fā)生碰撞,則又判斷是否有物體B的碰撞矩形和其相交,若有,則判斷A和B是否屬于同一隊(duì)伍以及物體B是否為不能碰撞,若其中有一為真,則不進(jìn)行任何處理,否則就調(diào)用Object類中的onCollide方法實(shí)現(xiàn)碰撞,流程如下: 圖9 物體實(shí)現(xiàn)碰撞流程 而Object類中的onCollide方法很簡(jiǎn)單,就是令發(fā)生碰撞的物體消失 void Obj

59、ect::onCollide { disappear <>; //令物體消失 } 而disappear方法又調(diào)用Level類中的processDie方法,processDie方法在之前已經(jīng)清楚地利用流程圖進(jìn)行了表示。至此,玩家與敵機(jī)的碰撞就完美解決了,但是子彈與玩家,子彈與敵機(jī),獎(jiǎng)子和玩家之間的碰撞還沒有實(shí)現(xiàn),為了實(shí)現(xiàn)子彈與玩家和子彈與敵機(jī)之間的碰撞,在Bullet類中重寫Object類中的onCollide方法,因?yàn)楦鱾€(gè)子彈之間和子彈與獎(jiǎng)子之間是不能發(fā)生碰撞的,所以,還必須先對(duì)與子

60、彈的碰撞矩形相交的物體進(jìn)行檢測(cè) void Bullet::onCollide { int id = obj->getRuntimeClassID<>; if //子彈與獎(jiǎng)子,子彈之間不能發(fā)生碰撞 { } else //子彈與玩家和敵機(jī)碰撞的實(shí)現(xiàn) { Explosion* ep = mEF->create ; if

61、 { ep->setPos >; mLevel->add ; } Object::onCollide ; } } 最后,便是獎(jiǎng)子與玩家碰撞的實(shí)現(xiàn),同樣,在Prize類中也重寫Object類中的onCollide方法,因?yàn)楠?jiǎng)子和子彈以及敵機(jī)是不能發(fā)生碰撞的,所以我們也必須對(duì)與獎(jiǎng)子的碰撞矩形相交的物體進(jìn)行檢測(cè) void Prize::onCollide { int id = obj->getRuntimeClassID<>; if

62、:ClassID || id==Enemy::ClassID> //獎(jiǎng)子不能與敵機(jī)和子彈發(fā)生碰撞 { } else { Object::onCollide ; //獎(jiǎng)子可以與玩家發(fā)生碰撞 mBeEaten = true; } } 5.2 關(guān)于游戲畫面的問題 由于我之前對(duì)于游戲編程只是一個(gè)初步認(rèn)識(shí),所以完全沒有接觸過關(guān)于圖像渲染及其他方面的知識(shí),所以之前這個(gè)方面我感到無能為力,所以我只有使用了同學(xué)給我提供的整個(gè)游戲框架,在這個(gè)框架中,所有的關(guān)于圖像資源的初始化,渲染和摧毀都已完成,而且實(shí)現(xiàn)這些功能的開

63、發(fā)包alleg,dev,io對(duì)外都是不透明的,所以無法看到其部的方法,但是我還是通過這幾個(gè)包實(shí)現(xiàn)了游戲背景的顯示,背景主要就是表現(xiàn)一些星星不停地閃爍,這主要是通過Background類實(shí)現(xiàn)的。 首先把星星放入關(guān)卡中,因?yàn)榉胖眯切堑膮^(qū)域不能超過關(guān)卡的區(qū)域,所以要設(shè)定放置星星的區(qū)域的寬度為關(guān)卡坐標(biāo)X2-X1,高度設(shè)為關(guān)卡坐標(biāo)Y2-Y1,同理,星星的位置也不能超過放置星星的區(qū)域,所以令星星的X坐標(biāo)和Y坐標(biāo)分別取放置星星區(qū)域的寬和高的一個(gè)隨機(jī)值,通過如下語句來實(shí)現(xiàn) s->pos.x = rand <> % w; s->pos.y = rand <> % h; 為了讓星星閃爍,就必須讓其每隔一段

64、時(shí)間更新一次,現(xiàn)在設(shè)定每30個(gè)周期更新一次,這只需要判斷時(shí)間是否為30的倍數(shù)即可〔s->delay = rand <> % 30〕另外,要實(shí)現(xiàn)閃爍,就要有顏色的變化,那么如何實(shí)現(xiàn)顏色的變化呢?dev包中有一個(gè)方法Color,只要賦給其一定的值,便能顯示出一定的顏色,顏色左端點(diǎn)的值為col1,右端點(diǎn)的值為col2,當(dāng)前顏色為col,開始時(shí)設(shè)定col=col1。 接下來的工作就是令星星開始閃爍,閃爍是通過定時(shí)器timer實(shí)現(xiàn)的,其基本思想是:對(duì)每一個(gè)星星都設(shè)置一個(gè)定時(shí)器timer,把其初值設(shè)為0,對(duì)它進(jìn)行自加,然后隨時(shí)對(duì)其進(jìn)行檢測(cè),如果它的值大于delay,則把它復(fù)位為0,如果它的值小于delay,則計(jì)算其占delay的比例〔float sc = s->timer / s->delay〕,然后根據(jù)比例對(duì)兩個(gè)顏色端點(diǎn)進(jìn)行線形插值計(jì)算當(dāng)前顏色〔color方法規(guī)定顏色有3個(gè)分量,所以顏色的每個(gè)分量都要計(jì)算〕,最后根據(jù)計(jì)算出的新顏色并更新星星的當(dāng)前顏色,流程如下: 圖10 星星顏色變化流程 "IT開拓者3網(wǎng)絡(luò)工作室"成立于20XX,是一個(gè)專業(yè)的計(jì)算機(jī)軟件開發(fā)團(tuán)隊(duì)。 "資源共享,信息互通" 需要更多相關(guān)設(shè)計(jì)資料和源代碼加QQ:493703123

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(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ì)自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!