基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)
《基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)》由會員分享,可在線閱讀,更多相關(guān)《基于VC的飛行模擬游戲的設(shè)計(jì)與實(shí)現(xiàn)(30頁珍藏版)》請?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ù)等諸多方面的容,除去市場價值的意義,電子游戲的發(fā)展的必要性還在于對我國文化產(chǎn)業(yè)的發(fā)展的重要性,游戲作為一種特殊的創(chuàng)意文化產(chǎn)品形態(tài),是文化產(chǎn)業(yè)鏈中不可缺少的一環(huán)。設(shè)計(jì)在利用已有的開發(fā)包和已有的游戲框架的基礎(chǔ)上,采用Microsoft Visual C++2005為開發(fā)平臺,這些開發(fā)包和框架已經(jīng)完美地解決了游戲圖像和音效方面的問題,設(shè)計(jì)的主要工作
2、就是向框架中添加自己所設(shè)計(jì)的類,用于實(shí)現(xiàn)設(shè)計(jì)所要實(shí)現(xiàn)的功能。在進(jìn)行類的設(shè)計(jì)時,運(yùn)用C++所具有的繼承和派生功能,使很大一部分代碼能夠得到重用,從而實(shí)現(xiàn)多態(tài),同時,還要在父類中很好地引入虛函數(shù),為指針能夠指向子類的同名成員提供方便,然后利用開發(fā)包里的方法來實(shí)現(xiàn)游戲背景的顯示,最終得到一個在Microsoft Visual C++2005上運(yùn)行的飛行模擬游戲,同時在運(yùn)行時不會出現(xiàn)重大尤其是會令游戲崩潰的BUG。 關(guān)鍵詞:飛行模擬;多態(tài);代碼重用 Design and realization of a flight simulati
3、on game 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
4、the 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 pr
5、oduction.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 perf
6、ectly.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 toactualizep
7、olymorphism, 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 s
8、imulation 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 / 30 目錄 論文總頁數(shù):26頁 1引言1 1.1課題背景1 1.2國外研究背景1 1.3本課題研究的意義1 1.4本課題研究的方法1 2游戲軟件的現(xiàn)狀和VC的概況1 2.1中國
9、游戲軟件的現(xiàn)狀1 2.2C++簡介2 2.3Microsoft Visual C++簡介3 2.4利用Visual C++開發(fā)游戲簡介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 對游戲設(shè)計(jì)的初步認(rèn)識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)1
10、5 4.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ā)工具的游戲都取得了巨大的成功,比如暴雪公司的《魔獸爭霸》系列和《魔獸世界》,這說明Visual C++開發(fā)游戲具有一定的優(yōu)勢。所以,在Visual C++平臺上設(shè)計(jì)游戲是極為
11、方便的,這也是優(yōu)勢所在。 1.2 國外研究背景 無論是在國還是國外,游戲編程已經(jīng)成為了一種時尚,許多程序員都忘我地投入到其中,他們其中有很多人不光是為了盈利,也有很多是純粹為了興趣,許多著名的游戲編程員本身就是狂熱的游戲玩家,所以,無論是國還是國外,誕生了很多經(jīng)典的游戲,其中利用Visual C++作為開發(fā)平臺的更是不勝枚舉,但是由于我國的游戲編程相對于國外起步較晚,所以在很多地方還存在不小的差距,甚至成了很多游戲軟件業(yè)比較發(fā)達(dá)的國家的游戲加工廠。 1.3 本課題研究的意義 目前,市面上的游戲可以說是層出不窮,并且隨著電腦硬件系統(tǒng)的改良,未來的游戲必將更智能化,更藝術(shù)化,更人性化,在高
12、性能的硬件設(shè)備支持下,游戲的驅(qū)動引擎更具威力,控制功能更加完備,給人們帶來更豐富的娛樂和體驗(yàn),好的游戲給人們的生活帶來了健康愉快的補(bǔ)充,唯美的藝術(shù)享受,潛默的教育功效,時尚的情感冶,如果沒有足夠的優(yōu)質(zhì)游戲,那么市場就不免會被粗劣的游戲充斥,可以說,對于青少年來說,誰對游戲編程有著更深入的理解和掌握,誰就掌握著游戲的導(dǎo)向權(quán)。 1.4 本課題研究的方法 采用Microsoft Visual C++2005為開發(fā)平臺,在利用已有的開發(fā)包和已有的游戲框架的基礎(chǔ)上,這些開發(fā)包和框架已經(jīng)完美地解決了游戲圖像和音效方面的問題,設(shè)計(jì)的主要工作就是添加自己所設(shè)計(jì)的類,用于實(shí)現(xiàn)本設(shè)計(jì)所要實(shí)現(xiàn)的功能,在進(jìn)行類的
13、設(shè)計(jì)時,運(yùn)用C++所具有的繼承和派生功能,使很大一部分代碼能夠得到重用,同時,還要在父類中很好地引入虛函數(shù),為指針能夠子類的同名成員提供方便,最后利用開發(fā)包里的方法來實(shí)現(xiàn)一個游戲背景的顯示。 2 游戲軟件的現(xiàn)狀和VC的概況 2.1 中國游戲軟件的現(xiàn)狀 軟件產(chǎn)業(yè)是當(dāng)前世界上增長最快的產(chǎn)業(yè)之一,并將成為21世紀(jì)推動世界經(jīng)濟(jì)發(fā)展和社會進(jìn)步的重要動力。近年來,主要國家軟件業(yè)平均以11%以上的增長率快速發(fā)展。據(jù)"oecd20XX信息技術(shù)展望"報(bào)告,1997年,其增長率成員國僅軟件包產(chǎn)值就占世界市場份額的94%,達(dá)1080億美元,并自1990年以來年11.2%。美國是世界上最大的軟件生產(chǎn)國,1997
14、年的軟件產(chǎn)值為1705.9億美元,占其當(dāng)年GDP的2.1%,出口額為155.5億美元。日本其次,1998年軟件產(chǎn)值約570億美元,但出口僅為0.82億美元。英國列第三,1999年的軟件產(chǎn)值為377.46億美元,占其GDP的1.2%,出口約16.2億美元。據(jù)對各國軟件業(yè)發(fā)展的軌跡分析,雖然各國的產(chǎn)業(yè)規(guī)模和出口額相差較大,但其成功的因素可歸納為以下幾點(diǎn):1. 對軟件知識產(chǎn)權(quán)的嚴(yán)格保護(hù),營造一種誰投資誰受益的良好商業(yè)和法治氛圍; 2. 服務(wù)到位的融資機(jī)構(gòu),促進(jìn)軟件成果轉(zhuǎn)化快; 3. 高素質(zhì)的軟件專業(yè)人才,配合制定靈活的技術(shù)移民政策; 4. 具有第一流的大學(xué)教育,能夠迅速適應(yīng)市場對人才的需求; 5.
15、發(fā)達(dá)的通信設(shè)施; 6. 長期磨煉的企業(yè)家精神; 7. 巨大的市場需求。 相比于其他國家,我國的軟件產(chǎn)業(yè)特別是游戲產(chǎn)業(yè)起步較晚,在很多地方上都不及一些軟件大國,但是近年來我國軟件業(yè)發(fā)展迅速,有關(guān)統(tǒng)計(jì)數(shù)據(jù)顯示,20XX,軟件產(chǎn)業(yè)銷售收入僅為796億元,到了20XX年底已經(jīng)達(dá)到4800億元,5年增長了6倍多。但與軟件產(chǎn)業(yè)發(fā)達(dá)國家相比,差距依然很大,絕大部分市場被國外軟件業(yè)巨頭壟斷,國產(chǎn)軟件占據(jù)的市場份額很少。在國際市場上,20XX國產(chǎn)軟件出口額為35.9億美元,僅占全球軟件市場份額的5.9%。 2.2 C++簡介 C++語言是在C語言的基礎(chǔ)上為支持面向?qū)ο蟮某绦蛟O(shè)計(jì)而研制的通用程序設(shè)計(jì)語言,
16、它是由AT&T貝爾實(shí)驗(yàn)室的Bjarne Stroustrup博士創(chuàng)建。研制C++的首要目標(biāo)是使C++首先是一個更好的C語言,所以根除了C語言中存在的問題,增加了許多新功能。C++的另一個目標(biāo)是支持面向?qū)ο蟮某绦蛟O(shè)計(jì),因此在C++中引入了類的機(jī)制。所研制的這個語言最初被稱為"帶類的C語言",1983年取名為C++。C++語言的標(biāo)準(zhǔn)化工作從1989年開始,于1994年制定了ANSI C++標(biāo)準(zhǔn)草案。 C++的主要特點(diǎn)有兩個方面:全面支持C語言與面向?qū)ο?。C++從C語言發(fā)展而來,保持了C語言的簡潔、高效和在某些操作上沿用了匯編語言指令的特點(diǎn)。同時,對C語言的類型進(jìn)行了系統(tǒng)的改革和擴(kuò)充,堵塞了C語言
17、中的許多漏洞,C++編譯提供了更好的類型檢查和編譯時的分析,能檢查出更多的類型錯誤。C++改善了C語言的安全性,比C語言更安全。由于C++保持與C語言兼容,這就使許多代碼不經(jīng)修改就可在C++編譯器下通過,用C語言編寫的眾多庫函數(shù)和實(shí)用軟件可方便地移植到C++中。因此,使用C語言的程序員能很快學(xué)會C++,使用C++進(jìn)行編程。另外,用C++編寫的程序可讀性好,代碼結(jié)構(gòu)更為合理。C++的最重要的特點(diǎn)是支持面向?qū)ο蟮某绦蛟O(shè)計(jì),使用C++編程,編程效率高;由于面向?qū)ο蟮姆椒ǜ咏祟愓J(rèn)識世界的方法,C++對于問題更容易描述,程序更容易理解與維護(hù);C++的模板對庫代碼的重用提供了支持;C++更有利于大型程
18、序設(shè)計(jì)。C++是一種支持多種程序設(shè)計(jì)方法的語言,提供對過程化和基于對象的程序設(shè)計(jì)方法的支持。適合于不同使用開發(fā)方法的編程人員。 2.3 Microsoft Visual C++簡介 Visual Studio是微軟公司推出的開發(fā)環(huán)境。是目前最流行的 Windows 平臺應(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)境,而
19、且與Win32緊密相連,所以,利用Visual C++開發(fā)系統(tǒng)可以完成各種各樣的應(yīng)用程序的開發(fā),從底層軟件直到上層直接面向用戶的軟件。而且,Visual C++強(qiáng)大的調(diào)試功能也為大型復(fù)雜軟件的開發(fā)提供了有效的排錯手段。 進(jìn)入21世紀(jì)以來,隨著多媒體技術(shù)和圖像技術(shù)的不斷發(fā)展,可視化技術(shù)得到廣泛的重視,越來越多的計(jì)算機(jī)專業(yè)人員和非專業(yè)人員都開始研究并應(yīng)用可視化技術(shù)。所謂可視化技術(shù),一般是指軟件開發(fā)階段的可視化和對計(jì)算機(jī)圖形技術(shù)和方法的應(yīng)用。Visual C++是一個很好的可視化編程工具,使用Visual C++環(huán)境來開發(fā)基于Windows的應(yīng)用程序大大縮短了開發(fā)時間,而且它的界面更友好,便于程序
20、員操作。 2.4 利用Visual C++開發(fā)游戲簡介 進(jìn)入上個世紀(jì)90年代以來,游戲開發(fā)進(jìn)入了可視化階段,并且Visual C++是首選的開發(fā)工具,在此期間,誕生了許多用Visual C++開發(fā)的經(jīng)典游戲,比如任天堂公司Family Computer主機(jī)上的《小蜜蜂》以及大名鼎鼎的《星際爭霸》,這些游戲不僅在當(dāng)時取得了巨大的成功,而且到現(xiàn)在也被奉為經(jīng)典??梢哉f在這個時期,Visual C++在游戲開發(fā)領(lǐng)域是獨(dú)領(lǐng)風(fēng)騷。 進(jìn)入了新千年,JAVA語言開始崛起,由于JAVA具有較高的可移植性,許多游戲,特別是很多手機(jī)游戲都轉(zhuǎn)向了JAVA平臺,但是縱觀市面上最火的單機(jī)游戲《魔獸爭霸3》和最火的網(wǎng)
21、絡(luò)游戲《魔獸世界》,都清一色的是用Visual C++開發(fā)的,這說明就算在新時期的游戲開發(fā)中, 利用Visual C++作為開發(fā)平臺還是具有一定優(yōu)勢的。
3 開發(fā)環(huán)境介紹
3.1 開發(fā)環(huán)境
操作系統(tǒng):Microsoft Windows XP
程序語言:C++
開發(fā)平臺:Visual C++ 2005
開發(fā)工具:Allegro
3.2 關(guān)于Allegro
Allegro是一個免費(fèi)為C和C++的開發(fā)人員提供的一個游戲編程庫,它支持以下操作系統(tǒng):DOS, Unix
22、MacOS X。它還提供了很多諸如圖形,聲音,玩家輸入<鍵盤,鼠標(biāo)和手柄>和定時器的功能。它也提供了浮點(diǎn)運(yùn)算功能,3D功能,文件管理功能和GUI。當(dāng)前最新版本為4.3.1,官方網(wǎng)址為 4 游戲程序的開發(fā) 4.1 游戲的思路和構(gòu)想 4.1.1 游戲想法的產(chǎn)生 資料顯示,在上個世紀(jì)風(fēng)靡一時的任天堂FC主機(jī)上,最火爆的飛行游戲便是《小蜜蜂》,這款游戲已其獨(dú)特的游戲方式征服了億萬玩家,這款游戲的游戲方式雖然極為簡單,但是卻極為有趣,停留在屏幕上方的蜜蜂不停地向下攻擊玩家所控制的飛機(jī),玩家不僅必須要避開蜜蜂的攻擊,還要控制飛機(jī)還擊蜜蜂而玩家擊中這些蜜蜂以后,他們死亡后會有一定幾率掉落增加玩家生命
23、,玩家子彈速度和玩家得分的獎子,而這款《小蜜蜂》,正是用C++語言開發(fā)的,這說明,在Visual C++平臺下開發(fā)一個類似于《小蜜蜂》的飛行射擊游戲是可行的。 4.1.2 對游戲設(shè)計(jì)的初步認(rèn)識 整個設(shè)計(jì)的關(guān)鍵詞如下:游戲、飛機(jī)、敵機(jī)、子彈、關(guān)卡、玩家、獎子、屏幕、三發(fā)子彈、雙發(fā)子彈、改變玩家子彈類型變化的獎子、增加玩家生命的獎子、爆炸,這些關(guān)鍵字都需要定義一個獨(dú)立的類來描述它們,并且,可以把飛機(jī)類設(shè)定為敵機(jī)類和玩家類的父類,因?yàn)轱w機(jī)類中的一些方法也可以用于敵機(jī)類和玩家類,同理,也應(yīng)該把獎子類設(shè)定為改變玩家子彈類型變化的獎子類和增加玩家生命的獎子類的父類,至于子彈,則不必用到繼承和派生,
24、因?yàn)闊o論是三發(fā)子彈還是雙發(fā)子彈,他們的屬性和功能都是一樣的,差別只是存在于視圖上。 4.1.3 模塊成型階段 進(jìn)一步熟悉了編程知識后,對框架做出了一些修改,逐步把游戲的基本功能確定。 1.Level類主要實(shí)現(xiàn)負(fù)責(zé)管理游戲中的所有物體,包括管理顯示,碰撞,創(chuàng)建和回收等,還提供了一些服務(wù),方便查詢關(guān)卡中的一些物體的信息。 2.Object類主要負(fù)責(zé)控制可見性,坐標(biāo)位置,設(shè)置速度等,其中就主要的一個功能就是判斷物體是否越界。 3.Plane類主要就是實(shí)現(xiàn)設(shè)定飛機(jī)的爆炸類型,子彈類型,實(shí)現(xiàn)開火以及設(shè)定開火冷卻時間,而其子類Enemy類則進(jìn)一步實(shí)現(xiàn)了設(shè)定敵機(jī)的生命值和掉落的獎子類型。另一個
25、子類Player類增加了實(shí)現(xiàn)玩家在被擊毀后誕生時的無敵時間。 4.Bullet類主要實(shí)現(xiàn)了子彈的創(chuàng)造。 5.Explosion類主要實(shí)現(xiàn)了爆炸的創(chuàng)造。 6.Prize類主要實(shí)現(xiàn)玩家"吃"掉獎子后改變玩家屬性。 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)了檢測碰撞,為Object類里的物體實(shí)現(xiàn)碰撞提供了接口,同時,Level類中的兩個方法getNearestEnemy和getNumCompanies則為敵機(jī)對玩家實(shí)行攻擊策略提供了函數(shù),最后,玩家"吃"
26、掉獎子后生命增加和得分增加的函數(shù)實(shí)現(xiàn)也包含在Level類中,所謂關(guān)卡,就必須要有一定的運(yùn)行狀態(tài),關(guān)卡運(yùn)行有三種狀態(tài),可以定義一個枚舉類型來定義三個不同的狀態(tài),這里用到枚舉類型的原因是,關(guān)卡運(yùn)行的狀態(tài)只有運(yùn)行,結(jié)束和失敗三種,只有有限的幾種可能值,雖然可以用int, char等類型來表示他們,但是對數(shù)據(jù)的合法性檢查卻是一件很麻煩的事情,而C++中的枚類型就是專門來解決這類問題的 typedef enum Status //關(guān)卡狀態(tài)定義一個名為Status的枚舉類型 { LEVEL_END, //關(guān)卡結(jié)束 LEVEL_FAILED,
27、 //關(guān)卡失敗 LEVEL_RUN, //關(guān)卡運(yùn)行 }; 同時,在游戲運(yùn)行中會發(fā)生不同的事件,也需要一一定義,由于游戲事件較多,同理,也需要定義一個枚舉類型來定義眾多的事件 enum Event { E_RenewPlayer,//! 創(chuàng)建玩家,關(guān)閉所有事件 E_ReadyDelay,//! 顯示‘ready’前的等待,并啟動E_Ready 事件 E_Ready,//! 顯示‘ready’,啟動E_RenewPlayer 事件
28、
E_LevelEnd,//! 使關(guān)卡處于完成狀態(tài),表示通關(guān)
E_LevelFailed,//! 使關(guān)卡處于失敗狀態(tài)
E_LevelFailedDelay,//! 關(guān)卡失敗前的等待,并啟動E_LevelFailed 事件
E_LevelEndDelay,//! 關(guān)卡通關(guān)前的等待,并啟動E_LevelEnd 事件
};
接下來,我們所要做的,便是創(chuàng)建關(guān)卡,從關(guān)卡文件中讀入物體數(shù)據(jù),創(chuàng)建物體并加入到關(guān)卡中
bool create 29、oard *kb>;
在關(guān)卡最初創(chuàng)建時,需要把敵機(jī)數(shù)目設(shè)置為0,把關(guān)卡狀態(tài)設(shè)置為運(yùn)行,同時應(yīng)該關(guān)閉定時器。接著就是使用io包的ReadFile創(chuàng)建對象rf,方便讀取文件,以實(shí)現(xiàn)關(guān)卡中敵機(jī)的初始化,由于IO包不透明,所以無法了解其部是如何實(shí)現(xiàn)這一功能的,在此,只能列出在文本中的格式,格式如下:
視圖 獎子 爆炸 子彈 體力 坐標(biāo)X 坐標(biāo)Y 策略號
視圖有兩種:編號1表示使用第一個敵機(jī)圖片,編號2表示使用第二個敵機(jī)圖片;獎子有四種:編號0表示沒有獎子,編號1表示獎一個生命的獎子,編號2表示獎勵三發(fā)子彈武器的獎子,編號3表示獎勵20分的獎子;爆炸有三種:編號0表示小型爆炸,編號1表示普通爆炸, 30、編號2表示大型爆炸;子彈有四種:編號0表示小單發(fā)子彈,編號1表示雙發(fā)子彈,編號2表示三發(fā)子彈,編號3表示反彈型單發(fā)子彈,編號4表示高速雙發(fā)子彈;體力的數(shù)值就表示可以被攻擊多少次;坐標(biāo)的兩個數(shù)值即為敵機(jī)在關(guān)卡中的坐標(biāo)位置。
比如說,要設(shè)置一個使用第一敵機(jī)圖片,掉落一個獎勵20分的獎子,爆炸類型為普通爆炸,發(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 32、p->setPos <&Vector 33、機(jī)死亡流程
其中在判斷物體的類別,并且完成玩家和或者敵機(jī)的死亡后繼續(xù)判斷玩家的生命是否用盡和敵機(jī)數(shù)目是否為0,這樣做的目的是為了避免在玩家和最后一個敵機(jī)同歸于盡的時候依然進(jìn)入關(guān)卡結(jié)束事件。
而update方法算是Level類中比較關(guān)鍵的方法,他更新關(guān)卡中的所有物體,包括檢測碰撞,更新定時器,處理碰撞等,其中最主要的方法便是物體的越界處理,首先計(jì)算物體的坐標(biāo)與關(guān)卡邊緣是否發(fā)生相交,其中判斷是否在X軸越界的算法為:取出物體的坐標(biāo),判斷其是否小于關(guān)卡的坐標(biāo)X1或者其是否大于關(guān)卡的坐標(biāo)X2,若滿足一項(xiàng)時,則調(diào)用Object類中的onOutOfArea方法,實(shí)現(xiàn)每個物體不停的越界實(shí)現(xiàn),流程圖如下
34、
開始
取出當(dāng)前物體的坐標(biāo)
是否大于關(guān)卡坐標(biāo)X2
或者小于關(guān)卡坐標(biāo)X3
通知物體做越界處理
結(jié)束開始
圖 3 判斷物體是否在X軸上越界流程
其中,關(guān)于檢測物體碰撞由于是本設(shè)計(jì)的重點(diǎn)和難點(diǎn),將放在后面的重要說明中具體說明。
關(guān)卡還需要實(shí)現(xiàn)兩個方法,那就是getNearestEnemy和getNumCompanies,它們主要是用來實(shí)現(xiàn)敵機(jī)的攻擊策略的,這里首先要聲明一下,當(dāng)玩家,敵機(jī)和獎子類被創(chuàng)建時,都會獲取一個ID,以表明其身份,同樣的,凡是通過這幾個類創(chuàng)建的對象也具有與其所屬類相同的ID,通過這樣的方法,就可以把關(guān)卡中 35、眾多的物體相互之間區(qū)分開。
getNearestEnemy主要是實(shí)現(xiàn)敵機(jī)將離其最近的玩家作為目標(biāo),以實(shí)現(xiàn)跟蹤策略,其基本思想是,以當(dāng)前物體作為中心,對整個關(guān)卡中的物體進(jìn)行一個遍歷,若它們同為敵機(jī),則繼續(xù),若它們一個為玩家,一個為敵機(jī),則計(jì)算出與其的距離,選出其中與自己距離最小的物體,判斷其是否小于最小距離,若小于,則把當(dāng)前物體鎖定為自己的目標(biāo),流程如下
圖4 鎖定最近敵人的流程
getNumCompanies方法主要是用于給敵機(jī)策略提供一個接口,它是基于這樣一個想法,那就是 36、當(dāng)敵機(jī)總數(shù)大于一個數(shù)值時,敵機(jī)不會做出任何攻擊動作,而當(dāng)玩家消滅一定數(shù)量后,敵機(jī)便會實(shí)行攻擊策略,getNumCompanies就是讓敵機(jī)獲取當(dāng)前敵機(jī)總數(shù),當(dāng)其返回值小于一定的值時便執(zhí)行攻擊策略,實(shí)現(xiàn)的方法仍然是對以當(dāng)前所指向的物體為中心進(jìn)行遍歷,若被遍歷到的物體與其為同一隊(duì)伍且同為敵機(jī)或玩家,則同伴數(shù)目增加1,最開始時,同伴數(shù)目設(shè)置為0,流程如下
圖5 取得同伴數(shù)目流程
此外,關(guān)卡還需要管理增加玩家生命和得分,用于實(shí)現(xiàn)玩家"吃"掉獎子后的屬性改變,分別定義為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)用一個Object類的指針刪除一個其子類的對象時,子類的析構(gòu)函數(shù)就不會被調(diào)用,雖然這樣做并沒有什么實(shí)際意義,但是這卻符合用C++進(jìn)行軟件開發(fā)的時候一般用來做基類的類的析構(gòu)函數(shù)設(shè)為虛函數(shù)的默認(rèn)規(guī)定,因此,需要將析 38、構(gòu)函數(shù)設(shè)為虛函數(shù)。
此外,還有幾個方法是需要重點(diǎn)提及的:
ObjectTracer* setTracer是設(shè)置越界處理器,這個處理器將處理物體的越界事件
ObjectTracer* setTracer 39、 40、 mTracer->onOutOfArea 41、么如何來實(shí)現(xiàn)這兩點(diǎn)呢?這就需要把速度設(shè)置為一個矢量,這樣一來,就可以把飛機(jī)的開火方向和面朝方向與速度方向取一致。
4.3.3 Plane類的實(shí)現(xiàn)
Plane類是Object類的子類,它通過Object類公有繼承而來,所以,凡是Object類中有的方法和屬性,它也具有,當(dāng)然,我們必須為起添加新的函數(shù)或者數(shù)據(jù),那么飛機(jī)相對于其他物體特有的屬性是什么呢?對,那就是它們死亡的時候會發(fā)生爆炸,它們也能發(fā)射子彈,而每種飛機(jī)所產(chǎn)生的爆炸類型和所發(fā)射的子彈類型都是不同的,所以,我們在Plane類中就設(shè)定幾個方法來設(shè)定物體的爆炸類型,所發(fā)射的子彈類型以及他們的速度
飛機(jī)的死亡會產(chǎn)生爆炸,同時也會變得不 42、可見
void Plane::die 43、進(jìn)行檢查,只要它的值不為0,就進(jìn)行自減,如果某個飛機(jī)有開火請求的話,就檢查定時器的值是否為0,如果為0,則允許開火,同時定時器的值復(fù)位為初值,如果定時器的值不為0,則開火請求無效,流程如下:
圖6 飛機(jī)開火冷卻流程
同時,由于假定飛機(jī)只能向前運(yùn)動,而不能向后運(yùn)動,所以飛機(jī)的朝向向量也就必須和它的速度向量一致,在前面已經(jīng)介紹過,在設(shè)定Object類中設(shè)定了物體的速度為矢量,這樣就可以把飛機(jī)的朝向向量與其速度矢量取一致了
if 44、
mFaceDirection.scale<0>;
mFaceDirection.add 45、<>, getTeam<>>;
if
return;
b->setPos 46、機(jī)的攻擊都對玩家無效,而且,照以往飛行游戲的慣例,在這段無敵時間,玩家是在不停閃爍的,為此,我們設(shè)定為其無敵時間為100,再取名一個為MatchlessTimer的定時器,讓其不停自減,當(dāng)減為0時,無敵效果取消,那么,如何實(shí)現(xiàn)玩家的閃爍呢?其實(shí)所謂"閃爍",意思就是其可視性在不停地變化,在這100時間,不停地對其視圖可視性取非運(yùn)算,以實(shí)現(xiàn)其閃爍的效果,當(dāng)無敵時間耗盡時,只需要干兩件事:第一,取消玩家無敵狀態(tài),通過設(shè)置玩家Collidable屬性為真實(shí)現(xiàn);第二,取消玩家的閃爍,通過設(shè)置玩家Visible屬性為真實(shí)現(xiàn)。
關(guān)于玩家的控制,將在后面的重要問題中說明。
4.3.5 Enemy類的 47、實(shí)現(xiàn)
Enemy類主要實(shí)現(xiàn)的功能是設(shè)定敵機(jī)的生命值,設(shè)定掉落獎子類型,其他一些行為全部由父類Plane繼承而來,但是對于update這個方法,Enemy類進(jìn)行了重寫,目的就是為了實(shí)現(xiàn)在不同時間敵機(jī)采用不同的攻擊策略來攻擊玩家,我們現(xiàn)在設(shè)定敵機(jī)每5個周期就執(zhí)行一次攻擊策略,那么如何實(shí)現(xiàn)敵機(jī)每5個周期就更新一次其攻擊策略呢?這同樣需要設(shè)置一個定時器UpdateAITimer來實(shí)現(xiàn),首先設(shè)置UpdateAITimer的初值為0,然后對它進(jìn)行自加,同時對UpdateAITimer的值進(jìn)行檢查,當(dāng)它的值為5的倍數(shù)時,敵機(jī)的攻擊策略就進(jìn)行更新,再進(jìn)一步,如何判斷UpdateAITimer的值是否為5的倍 48、數(shù)呢?當(dāng)然通過把 UpdateAITimer的值對5取余,當(dāng)?shù)玫降闹档扔?時,UpdateAITimer的值即為5的倍數(shù),敵機(jī)的攻擊策略也就進(jìn)行相應(yīng)的更新。
那敵機(jī)的攻擊策略由誰負(fù)責(zé)管理?所有敵機(jī)的攻擊策略都是由AI指針管理,在關(guān)卡剛創(chuàng)建時,AI指針指向的是DefaultAI,這時敵機(jī)的攻擊策略是不作出任何動,作在敵機(jī)執(zhí)行DefaultAI時,他會調(diào)用Level中的getNumCompanies方法,當(dāng)返回值小于最小友軍數(shù)目時,它便會調(diào)用Level中的getNearestEnemy方法,它的目的是尋找是否有玩家,若玩家已被擊毀,則執(zhí)行DefaultAI,停止任何動作,如果玩家仍然存在,那么就 49、把玩家的坐標(biāo)取出,與自己的坐標(biāo)相減,算出距離,若距離小于最小距離mMinDist,則實(shí)施隨機(jī)開火策略,開火幾率是1%到100%之間的一個隨機(jī)數(shù),流程如下:
圖7 敵機(jī)攻擊策略更新流程
那么,如何保證開火幾率為0%至100%之間的一個隨機(jī)數(shù)呢?這就要通過一個隨機(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類的子類,繼承了Obj 50、ect類的所有屬性和方法,其中,子彈都是由子彈工廠BulletFct創(chuàng)造的,也是由其銷毀的,子彈共有3種,同前面介紹的一樣,為了方便,可以定義一個枚舉類型來描述它
typedef enum BulletType
{
BT_NORMAL,
BT_DOUBLE,
BT_THREE,
};
接下來,就要創(chuàng)建子彈,但是由于BulletFct不知道是要創(chuàng)建哪種子彈,所以在創(chuàng)建子彈的時候,需要一條switch語句來判斷所要創(chuàng)建子彈的類型,共有3種子彈類型,所以switch語句就應(yīng)該 51、有3種case,分別對每一種子彈進(jìn)行相應(yīng)的視圖創(chuàng)建。
在這里有一個問題,那就是BulletFct一次性地創(chuàng)建了200個子彈,如果不對其進(jìn)行回收,這就勢必會大大增加了系統(tǒng)的開銷,導(dǎo)致運(yùn)行速度的緩慢,如何解決著一問題呢?可以創(chuàng)建一個"池子",創(chuàng)建的所有子彈都先放入這個池子中,當(dāng)飛機(jī)開火需要子彈時,再從池中取出子彈供其使用,同理,當(dāng)關(guān)卡中有不用的子彈時,也放入池中以供以后使用,這樣就大大增強(qiáng)了資源的重利用,也節(jié)省了許多不必要的系統(tǒng)開銷,這個表的主要思想是:存放一群物體。根據(jù)物體的使用情況,存放到兩個表。一個表存放所有物體,另外一個表存放無效的物體。當(dāng)用戶需要物體時,從無效的物體表取給用戶。當(dāng)用戶用 52、完后回收時,存放這個物體到無效物體表以供下次使用,流程如下:
圖8 子彈調(diào)用和回收流程
在本游戲中,所有的子彈只能是直線向上或者向下運(yùn)動,所以它的更新方法比較簡單,只需要先判定子彈是否誕生,如果誕生的話,就取出它的坐標(biāo)以及它的速度向量,然后以其速度向量為方向?qū)ζ渥鴺?biāo)作加。
4.3.7 Prize類的實(shí)現(xiàn)
Prize類和Bullet類似,也是Object類的子類,它的主要功能是實(shí)現(xiàn)獎子的創(chuàng)建和銷毀,以及設(shè)定和玩家的碰撞行為,獎子一共有3種,但是我們把沒有獎子也算成一種,所以共有4種獎子,同樣用一個枚舉類型來定義它
typ 53、edef enum PrizeType
{
BT_NO, //沒有獎子
BT_LIFE, //增加玩家生命的獎子
BT_THREE_BULLET, //子彈變?yōu)槿l(fā)的獎子
BT_SCORE, //增加玩家得分的獎子
};
獎子都是由PrizeFct創(chuàng)建的,3種不同的獎子的創(chuàng)建方法是不同的,所以,也需要一條switch語句來分別實(shí)現(xiàn)4種〔其實(shí)只有3種,因?yàn)闆]有獎子是不需要創(chuàng)建任何東西的〕不同獎子的創(chuàng)建。
在本游戲中,子彈的更新方法只是與子彈類似,也同樣是取出它的坐標(biāo)以及它的速度向量,然后以 54、其速度向量為方向?qū)ζ渥鴺?biāo)作加。
那么獎子如何實(shí)現(xiàn)改變玩家的相關(guān)屬性的呢?為了實(shí)現(xiàn)不同獎子改變玩家不同屬性,我們又用 Prize類派生出3個子類:AddLifePrize 類,ChangeBulletPrize類和ScorePrize類,分別用來實(shí)現(xiàn)增加玩家生命值,改變玩家子彈和增加玩家得分,以AddLifePrize 類舉例,它增加玩家的生命就通過調(diào)用Level類中的addPlayerLife函數(shù)實(shí)現(xiàn)
void AddLifePrize::changeAttribute 55、,ChangeBulletPrize類改變玩家子彈通過調(diào)用Player類中的SetBulletType函數(shù)來實(shí)現(xiàn)
void ChangeBulletPrize::changeAttribute 56、到的一些重要問題
5.1 關(guān)于碰撞的問題
碰撞檢測問題是本程序的難點(diǎn)和重點(diǎn),也是所有飛行射擊游戲的難點(diǎn)和重點(diǎn),所謂碰撞檢測,就是指檢測在某一時刻是否有2個或者以上的碰撞矩形相交。那么我們首先要做的就是設(shè)定一個物體的碰撞矩形,具體做法為,在PlaneView中以此物體視圖的中心為點(diǎn),上,下,各取視圖高度的一半,左,右各取視圖寬度的一半,然后調(diào)用Object類中的setCollShape方法來設(shè)定其碰撞矩形
void PlaneView::changeShape 57、<>;
obj->setCollShape <&Rect<-w/2,-h/2, w/2, h/2>>;
}
雖然給物體的碰撞矩形設(shè)定完畢了,但是我們設(shè)想一下,當(dāng)物體開始移動時,也就是視圖開始移動,但是它的碰撞矩形卻還留在原地,這顯然會造成碰撞檢測不能正確地完成,如何解決呢?
virtual void update 58、前坐標(biāo)上
};
接下來,我們所要做的就是進(jìn)行碰撞檢測,這個方法是由Level類實(shí)現(xiàn)的,先從一個物體A開始,若A被設(shè)定為不能碰撞,則繼續(xù)從下一個物體開始,若A能發(fā)生碰撞,則又判斷是否有物體B的碰撞矩形和其相交,若有,則判斷A和B是否屬于同一隊(duì)伍以及物體B是否為不能碰撞,若其中有一為真,則不進(jìn)行任何處理,否則就調(diào)用Object類中的onCollide方法實(shí)現(xiàn)碰撞,流程如下:
圖9 物體實(shí)現(xiàn)碰撞流程
而Object類中的onCollide方法很簡單,就是令發(fā)生碰撞的物體消失
void O 59、bject::onCollide 60、與子彈的碰撞矩形相交的物體進(jìn)行檢測
void Bullet::onCollide 61、 {
ep->setPos
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 6.煤礦安全生產(chǎn)科普知識競賽題含答案
- 2.煤礦爆破工技能鑒定試題含答案
- 3.爆破工培訓(xùn)考試試題含答案
- 2.煤礦安全監(jiān)察人員模擬考試題庫試卷含答案
- 3.金屬非金屬礦山安全管理人員(地下礦山)安全生產(chǎn)模擬考試題庫試卷含答案
- 4.煤礦特種作業(yè)人員井下電鉗工模擬考試題庫試卷含答案
- 1 煤礦安全生產(chǎn)及管理知識測試題庫及答案
- 2 各種煤礦安全考試試題含答案
- 1 煤礦安全檢查考試題
- 1 井下放炮員練習(xí)題含答案
- 2煤礦安全監(jiān)測工種技術(shù)比武題庫含解析
- 1 礦山應(yīng)急救援安全知識競賽試題
- 1 礦井泵工考試練習(xí)題含答案
- 2煤礦爆破工考試復(fù)習(xí)題含答案
- 1 各種煤礦安全考試試題含答案