版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 畢 業(yè) 設(shè) 計(jì)</b></p><p> 題目基于Cocos2D-X的跨平臺(tái)游戲的設(shè)計(jì)與實(shí)現(xiàn)</p><p> 姓 名 學(xué) 號(hào) </p><p> 系(院) 班 級(jí) </p><p&
2、gt; 指導(dǎo)教師 職 稱 </p><p> 二O一四 年 五 月 二十 日</p><p><b> 目 錄</b></p><p><b> 第一章緒論4</b></p><p> 1.1 手游背景4</p><
3、p> 1.2 發(fā)展趨勢(shì)4</p><p> 1.3 研究意義4</p><p> 1.4 不足之處5</p><p><b> 第二章相關(guān)技術(shù)6</b></p><p> 2.1 C++語(yǔ)言6</p><p> 2.2 Cocos2D-X平臺(tái)技術(shù)介紹6</p&g
4、t;<p><b> 2.3開發(fā)工具7</b></p><p><b> 第三章設(shè)計(jì)概要8</b></p><p> 3.1 游戲介紹8</p><p> 3.2游戲的結(jié)構(gòu)例圖8</p><p> 3.3功能模塊分析圖10</p><p>
5、 3.3.1 游戲歡迎頁(yè)面10</p><p> 3.3.2 游戲主頁(yè)面10</p><p> 3.4游戲失敗11</p><p> 第四章項(xiàng)目設(shè)計(jì)12</p><p> 4.1 游戲架構(gòu)設(shè)計(jì)12</p><p> 第五章項(xiàng)目實(shí)現(xiàn)13</p><p> 5.1游戲總體實(shí)現(xiàn)
6、13</p><p> 5.2各模塊實(shí)現(xiàn)13</p><p> 5.2.1功能的實(shí)現(xiàn)依賴13</p><p> 5.2.2 游戲主歡迎頁(yè)的實(shí)現(xiàn)13</p><p> 5.2.3游戲主場(chǎng)景15</p><p> 5.2.4游戲主角類16</p><p> 5.2.5敵機(jī)類
7、17</p><p> 5.2.6 敵機(jī)管理19</p><p> 5.2.7 觸摸事件22</p><p> 5.2.8 游戲結(jié)束場(chǎng)景23</p><p> 第六章學(xué)習(xí)心得24</p><p> 第七章項(xiàng)目總結(jié)與展望25</p><p><b> 參考文獻(xiàn)26
8、</b></p><p><b> 第1章 緒論</b></p><p><b> 1.1 手游背景</b></p><p> 手游指在手機(jī)等各類手持硬件設(shè)備上運(yùn)行的游戲類應(yīng)用程序,其需要具備一定硬件環(huán)境和一定系統(tǒng)級(jí)程序作為運(yùn)行基礎(chǔ)。2004年,手機(jī)游戲均為WAP游戲,到2005年,圖形化手機(jī)游戲激增,
9、已經(jīng)超過(guò)40余 款。2005年6月,盛大英特爾宣布攜手共同開發(fā)國(guó)內(nèi)手機(jī)游戲市場(chǎng),手機(jī)網(wǎng)游行業(yè)陣營(yíng)開始空前壯大,繼盛大、北京掌訊、美通之后,網(wǎng)易、空中,標(biāo)派等也紛 紛加入,目前國(guó)內(nèi)手機(jī)游戲廠商已經(jīng)近30家。手機(jī)游戲尚處于市場(chǎng)導(dǎo)入期,在未來(lái)幾年內(nèi),手機(jī)游戲?qū)⒉饺肟焖侔l(fā)展階段。</p><p><b> 1.2 發(fā)展趨勢(shì)</b></p><p> 近年來(lái),隨著智能機(jī)的普
10、及以及3G的覆蓋率增加,手機(jī)網(wǎng)游日益興起,現(xiàn)已經(jīng)有近兩千萬(wàn)的手機(jī)網(wǎng)游玩家了。2014年,國(guó)內(nèi)移動(dòng)互聯(lián)網(wǎng)競(jìng)爭(zhēng)格局未定,運(yùn)營(yíng)商拒絕管道化欲謀更多話語(yǔ)權(quán),轉(zhuǎn)型力度、資源投入日趨加大;在部分細(xì)分領(lǐng)域,圍繞運(yùn)營(yíng)商轉(zhuǎn)型的業(yè)務(wù)和渠道價(jià) 值驟然放大,引發(fā)產(chǎn)業(yè)整合日趨頻繁。在此背景下,國(guó)內(nèi)移動(dòng)互聯(lián)龍頭拓維信息通過(guò)多年技術(shù)積累及運(yùn)營(yíng)商渠道優(yōu)勢(shì),確定以手機(jī)動(dòng)漫與游戲業(yè)務(wù)為兩大核心發(fā)展方 向之一。</p><p><b>
11、1.3 研究意義</b></p><p> 全球在使用的移動(dòng)電話已經(jīng)超過(guò)10億部,而且這個(gè)數(shù)字每天都在不斷增加。在除美</p><p> 國(guó)外的各個(gè)發(fā)達(dá)國(guó)家,手機(jī)用戶都比計(jì)算機(jī)用戶多。手機(jī)游戲潛在的市場(chǎng)比其他任何平臺(tái),比如PlayStation和GameBoy都要大。在控制臺(tái)游戲時(shí)代,GameBoy熱銷的一個(gè)原因就是便攜性——人們可以隨時(shí)隨 地沉浸在自己喜歡的游戲中,還可以
12、隨時(shí)隨地?fù)屬?gòu)自己喜歡的裝備或?qū)櫸?。和游戲控制臺(tái)或者PC相比,手機(jī)雖然可能不是一個(gè)理想的游戲設(shè)備,但畢竟人們總是隨 時(shí)隨身攜帶,這樣手機(jī)游戲很可能成為人們消遣時(shí)間的首選。手機(jī)便攜性、移動(dòng)性的特征更能滿足用戶隨時(shí)隨地玩游戲的需求,用戶利用排隊(duì)、等車的時(shí)間進(jìn)行游 戲,手機(jī)游戲碎片化的特性凸顯。調(diào)查顯示,29.8%的用戶在用手機(jī)玩游戲以后電腦端玩游戲的時(shí)間減少,手機(jī)游戲已經(jīng)開始搶奪電腦游戲時(shí)間。22.4%的 用戶手機(jī)游戲時(shí)間越來(lái)越長(zhǎng),僅有10%
13、的用戶時(shí)間變短,手機(jī)游戲已逐漸成為一種普遍的娛樂方式。因?yàn)槭謾C(jī)是網(wǎng)絡(luò)設(shè)備,在一定限制因素下可以實(shí)現(xiàn)多人在線游戲。隨著移動(dòng)網(wǎng)絡(luò)的發(fā)展,移 動(dòng)游戲也越來(lái)越多的被大家接受,對(duì)于之前長(zhǎng)期通知市場(chǎng)的掌機(jī)來(lái)說(shuō)造成了不少的沖擊。市場(chǎng)研究公司IDC和App Annie報(bào)告顯示2013年第一季度iOS和Android平臺(tái)游戲業(yè)務(wù)營(yíng)收是掌機(jī)</p><p><b> 第2章 相關(guān)設(shè)計(jì)</b></p&g
14、t;<p><b> 2.1 C++語(yǔ)言</b></p><p> C++語(yǔ)言是一種使用非常廣泛的計(jì)算機(jī)編程語(yǔ)言。是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設(shè)計(jì)語(yǔ)言。它支持過(guò)程化程序設(shè)計(jì)、數(shù)據(jù)抽象、面向?qū)ο蟪绦蛟O(shè)計(jì)、泛型程序設(shè)計(jì)等多種程序設(shè)計(jì)風(fēng)格。</p><p> C++在一定程度上可以和C語(yǔ)言很好的結(jié)合,甚至大多數(shù)C語(yǔ)言程序是在C++
15、的集成開發(fā)環(huán)境中完成的。C++相對(duì)眾多的面向?qū)ο蟮恼Z(yǔ)言,具有相當(dāng)高的性能。</p><p> C++引入了面向?qū)ο蟮母拍?,使得開發(fā)人機(jī)交互類型的應(yīng)用程序更為簡(jiǎn)單、快捷。很多優(yōu)秀的程序框架包括MFC、QT就是使用的C++。</p><p> C++避免平臺(tái)限定或沒有普遍用途的特性。</p><p> C++不使用會(huì)帶來(lái)額外開銷的特性。</p>&l
16、t;p> C++設(shè)計(jì)成無(wú)需復(fù)雜的程序設(shè)計(jì)環(huán)境。</p><p> 2.2 Cocos2D-X平臺(tái)技術(shù)介紹</p><p> cocos2d是一個(gè)基于MIT協(xié)議的開源框架,用于構(gòu)建游戲、應(yīng)用程序和其他圖形界面交互應(yīng)用。這是一個(gè)C++ Cocos2d-iPhone項(xiàng)目的版本。Cocos2d-X發(fā)展的重點(diǎn)是圍繞Cocos2d跨平臺(tái),Cocos2d-x提供的框架。手機(jī)游戲,可以寫在 C
17、++或者Lua中,使用API是Cocos2d-iPhone完全兼容。Cocos2d-x項(xiàng)目可以很容易地建立和運(yùn)行在IOS,Android,黑莓 Blackberry等操作系統(tǒng)中。Cocos2d-x還支持Windows、Mac和Linux等桌面操作系統(tǒng),因此,開發(fā)者編寫的源代碼很容易在桌面操作系統(tǒng)中編輯和調(diào)試。</p><p> Cocos2D-X主要功能:流程控制(Flow control):非常容易地管理不同
18、場(chǎng)景(scenes)之間的流程控制;精靈(Sprites):快速而方便的精靈;動(dòng)作(Actions):告訴精靈們?cè)撟鍪裁?。可組合的動(dòng)作如移動(dòng)(move)、旋轉(zhuǎn)(rotate)和縮放(scale)等更多;特效(Effects):特效包括波浪(waves)、旋轉(zhuǎn)(twirl)和透鏡(lens)等更多;平面地圖(Tiled Maps):支持包括矩形和六邊形平面地圖;轉(zhuǎn)換(Transitions):從一個(gè)場(chǎng)景移動(dòng)到另外一個(gè)不同風(fēng)格的場(chǎng)景;菜單(
19、Menus):創(chuàng)建內(nèi)部菜單;文本渲染(Text Rendering):支持標(biāo)簽和HTML標(biāo)簽動(dòng)作;文檔(Documents):編程指南 + API參考 + 視頻教學(xué) + 很多教用戶如何使用的簡(jiǎn)單測(cè)試?yán)樱籑IT許可:盡管用就是了;基于Pyglet:沒有外部的依賴;基于OpenGL:支持硬件加速;3D對(duì)象:MD2模型支持;腳本語(yǔ)言:支持Lua,JavaScript語(yǔ)言。</p><p> 圖2.2 Cocos2D
20、-X引擎架構(gòu)</p><p><b> 2.3開發(fā)工具</b></p><p> 游戲在Windows XP系統(tǒng)下開發(fā),基于visual studio C++ 2008的開發(fā)平臺(tái),采用了cocos2d-x技術(shù)進(jìn)行開發(fā)。</p><p> 操作系統(tǒng):Microsoft Windows 7&l
21、t;/p><p><b> 程序語(yǔ)言:C++</b></p><p> 開發(fā)工具:Microsoft Visval Studio 2012,cocos2d-x-2.2.2</p><p> Microsoft Visual C++,(簡(jiǎn)稱Visual C++、MSVC、VC++或VC)微軟公司
22、的C++開發(fā)工具,具有集成開發(fā)環(huán)境,可提供編輯C語(yǔ)言,C++以及C++等編程語(yǔ)言。Visual C++以擁有“語(yǔ)法高亮”,IntelliSense(自動(dòng)編譯功能)以及高級(jí)除錯(cuò)功能而著稱。比如,它允許用戶進(jìn)行遠(yuǎn)程調(diào)試,單步執(zhí)行等。還有允許用戶在調(diào)試期間重新編譯被修改的代碼,而不必重新啟動(dòng)正在調(diào)試的程序。其編譯及建置系統(tǒng)以預(yù)編譯頭文件、最小重建功能及累加鏈接著稱。這些特征明顯縮短程序編輯、編譯及鏈接的時(shí)間花費(fèi),在大型軟件計(jì)劃上尤其
23、顯著。</p><p> C++語(yǔ)言是目前面向?qū)ο缶幊痰氖走x語(yǔ)言,學(xué)習(xí)、使用C++語(yǔ)言并進(jìn)行應(yīng)用程序設(shè)計(jì)的人員非常多,Microsoft公司的Visual C++2008 因其強(qiáng)大的功能、非常友好的界面而成為當(dāng)前最為熱門C++語(yǔ)言開發(fā)環(huán)境。Visual C++提供的集成開發(fā)環(huán)境、MFC類庫(kù)和應(yīng)用程序框架極大地便利了用C++語(yǔ)言開發(fā)Windows應(yīng)用程序所需的源代碼編
24、寫、用戶界面設(shè)計(jì)、消息映射、編譯鏈接和調(diào)試運(yùn)行等工作。</p><p><b> 第3章 設(shè)計(jì)概要</b></p><p><b> 3.1 游戲介紹</b></p><p> 這是一款飛行射擊類游戲,整體環(huán)境主要還是圍繞太空為主,高保真的音效,為玩家呈現(xiàn)一場(chǎng)不一樣射擊體驗(yàn)。簡(jiǎn)單的觸屏操 作,觸屏按住隨意一個(gè)地方,
25、左右移動(dòng),便可自動(dòng)攻擊敵人,上下移動(dòng)亦可躲避強(qiáng)敵。在飛機(jī)的左下角還有兩個(gè)道具槽,直接點(diǎn)擊就可以發(fā)動(dòng)道具效果,前提是你必 須要吃到道具。玩家在游戲中要做的就是駕駛著最新戰(zhàn)機(jī),在敵機(jī)身前發(fā)動(dòng)攻擊。在擊毀敵機(jī)的同時(shí)獲得分?jǐn)?shù),擊毀的敵機(jī)越多,則相對(duì)的獲得分?jǐn)?shù)就越高。玩家進(jìn)行游戲的時(shí)候需要注意不能被敵機(jī)及敵機(jī)子彈碰到,否則玩家控制角色死亡,同時(shí)游戲結(jié)束。記錄玩家獲取的積分。</p><p> 3.2游戲的結(jié)構(gòu)例圖<
26、/p><p> 游戲的結(jié)構(gòu)例圖如圖3.2所示:</p><p> 圖3.2游戲的結(jié)構(gòu)圖例圖</p><p> 3.3功能模塊分析圖</p><p> 游戲功能模塊主體分析:</p><p> 3.3.1 游戲歡迎頁(yè)面</p><p> 游戲歡迎頁(yè)面主要是預(yù)加載游戲進(jìn)行需要的圖片、音樂等資
27、源進(jìn)行預(yù)加載。</p><p> 3.3.2 游戲主頁(yè)面</p><p> 游戲主頁(yè)面邏輯判斷如圖3.3所示。</p><p> 圖3.3游戲主頁(yè)面邏輯判斷圖</p><p> 道具使用邏輯圖如下:</p><p> 圖3.3道具使用邏輯圖</p><p><b> 3.4
28、游戲失敗</b></p><p><b> 游戲失敗邏輯圖</b></p><p> 圖3.4游戲失敗邏輯圖</p><p><b> 第4章 項(xiàng)目設(shè)計(jì)</b></p><p> 4.1 游戲架構(gòu)設(shè)計(jì)</p><p> 由項(xiàng)目的需求分析可以清晰的對(duì)本游
29、戲的具體功能實(shí)現(xiàn)進(jìn)行設(shè)計(jì),如下圖4.1是本游戲的總體架構(gòu)設(shè)計(jì)。</p><p> 圖4.1 游戲總體構(gòu)架設(shè)計(jì)</p><p> 通過(guò)對(duì)游戲的需求進(jìn)行分析和細(xì)致的歸納,可以認(rèn)為游戲的主要內(nèi)容是由游戲進(jìn)行時(shí)和游戲失敗兩個(gè)主要部分所構(gòu)成。游戲進(jìn)行時(shí)包含了用戶對(duì)主角的操作以及對(duì)主角信息(獲得的分?jǐn)?shù)及獲取的道具)的管理,用戶游戲結(jié)束的操作選擇,游戲進(jìn)行為本系統(tǒng)的設(shè)計(jì)核心?;谶@些考慮,本游戲?qū)?duì)
30、游戲進(jìn)行時(shí)的事件作為一個(gè)重點(diǎn)的功能模塊進(jìn)行詳細(xì)設(shè)計(jì)。</p><p><b> 第5章 項(xiàng)目實(shí)現(xiàn)</b></p><p> 前四章是對(duì)游戲的邏輯和功能上的設(shè)計(jì),而游戲?qū)崿F(xiàn)階段就要依據(jù)之前的成果將抽象化設(shè)計(jì)轉(zhuǎn)化為物理實(shí)現(xiàn)。</p><p><b> 5.1游戲總體實(shí)現(xiàn)</b></p><p>
31、 游戲的模塊結(jié)構(gòu)是對(duì)游戲的進(jìn)行一個(gè)總體劃分,要真正的實(shí)現(xiàn)游戲,還需要進(jìn)一步的設(shè)計(jì)用戶的功能。</p><p> 游戲的功能分為十類:游戲主場(chǎng)景、游戲歡迎頁(yè)、游戲主角類、游戲敵機(jī)類、子彈類、游戲場(chǎng)景類、游戲結(jié)束場(chǎng)景類、管理類、道具類、觸摸事件,針對(duì)每一個(gè)功能都實(shí)現(xiàn)了不同的作用。</p><p><b> 5.2各模塊實(shí)現(xiàn)</b></p><p&
32、gt; 本文對(duì)貨單管理模塊、個(gè)人信息管理模塊、系統(tǒng)信息管理模塊中的功能具體實(shí)現(xiàn)過(guò)程進(jìn)行論述。</p><p> 5.2.1功能的實(shí)現(xiàn)依賴</p><p> 項(xiàng)目創(chuàng)建的時(shí)候需要添加cocos2d-x的支持項(xiàng),如圖5.2.1,</p><p><b> 圖5.2.1</b></p><p> 搭建好的工程在第一次創(chuàng)
33、建項(xiàng)目的時(shí)候會(huì)自動(dòng)把需要的外部依賴項(xiàng)添加到項(xiàng)目下,不需要手動(dòng)額外添加。</p><p> 需要注意的是,在開始一個(gè)項(xiàng)目的時(shí)候,要把需要用到的圖片資源以及音樂添加到項(xiàng)目目錄下,否則在項(xiàng)目進(jìn)行的過(guò)程中會(huì)報(bào)錯(cuò)。資源文件盡量不要用中文命名,有時(shí)會(huì)出現(xiàn)字符編碼的錯(cuò)誤。</p><p> 5.2.2 游戲主歡迎頁(yè)的實(shí)現(xiàn)</p><p> 用戶在進(jìn)去游戲的時(shí)候,會(huì)首先進(jìn)入到
34、歡迎頁(yè)面(圖5.2.2.1)。</p><p><b> 圖5.2.2.1</b></p><p> 歡迎頁(yè)是為了對(duì)資源,即圖片資源和音樂資源進(jìn)行預(yù)加載,圖片資源和音樂資源相對(duì)較大,進(jìn)入游戲后在加載比較慢,對(duì)游戲體驗(yàn)會(huì)造成一定影響,所以在歡迎頁(yè)面進(jìn)行預(yù)加載,進(jìn)入游戲后可以享受較好的體驗(yàn),不會(huì)因?yàn)榧虞d資源而造成游戲卡的問(wèn)題。</p><p>
35、<b> 加載資源代碼如下:</b></p><p><b> //加載音樂資源</b></p><p> PreloadMusic();</p><p> void WelcomeLayer::PreloadMusic()</p><p><b> {</b><
36、;/p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic("sound/game_music.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect(
37、"sound/bullet.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/enemy1_down.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEn
38、gine()->preloadEffect("sound/enemy2_down.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/enemy3_down.mp3");</p><p> CocosDenshio
39、n::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/game_over.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/get_bomb.mp3");</p>
40、<p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/get_double_laser.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("soun
41、d/use_bomb.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/big_spaceship_flying.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedE
42、ngine()->preloadEffect("sound/achievement.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->preloadEffect("sound/out_porp.mp3");</p><p> CocosDenshion:
43、:SimpleAudioEngine::sharedEngine()->preloadEffect("sound/button.mp3");</p><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->playBackgroundMusic("sound/game_music.mp3",true);&l
44、t;/p><p><b> }</b></p><p> 這是做一個(gè)檢測(cè),可以不添加,但是為了保證代碼的健壯性要添加:</p><p> bool bRet=false;</p><p><b> do</b></p><p><b> {</b>
45、</p><p> CC_BREAK_IF(!CCLayer::init());</p><p><b> 、、、、、、、</b></p><p> bRet=true;</p><p> } while (0);</p><p> return bRet;</p><
46、;p> 5.2.3游戲主場(chǎng)景</p><p> 游戲主場(chǎng)景是為添加的精靈提供一個(gè)層,所有的精靈都是在這個(gè)層上進(jìn)行添加。</p><p> 5.2.4游戲主角類</p><p> 創(chuàng)建游戲主角后,然他在進(jìn)入游戲后閃爍三次,主角在進(jìn)行飛行的時(shí)候讓尾巴的煙火一長(zhǎng)一短,顯示正在飛行,這里是通過(guò)兩個(gè)圖片不斷交替顯示完成的。</p><p>
47、; //創(chuàng)建 CCBlink 效果</p><p> CCBlink *blink=CCBlink::create(1,3);</p><p><b> //</b></p><p> CCAnimation* animation=CCAnimation::create();</p><p> //通過(guò).png
48、 和 .plist文件創(chuàng)建精靈表</p><p> //animation->addSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero1.png"));</p><p> //animation->addSpriteFrame(CCSpr
49、iteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("hero2.png"));</p><p> //從本地文件系統(tǒng)中加載圖片文件到CCSpriteFrame中區(qū),然后添加到CCAnimation中</p><p> for (int i = 1; i < 3; i++)</p&g
50、t;<p><b> {</b></p><p> char szImageFileName[128] = {0};</p><p> sprintf(szImageFileName, "hero%d.png", i);</p><p> animation->addSpriteFrameWith
51、FileName(szImageFileName);</p><p> CC_BREAK_IF(!animation);</p><p><b> }</b></p><p> animation->setDelayPerUnit(0.1f);</p><p> CCAnimate* animate=CCA
52、nimate::create(animation);</p><p> plane->runAction(blink);</p><p> plane->runAction(CCRepeatForever::create(animate));</p><p> 主角在飛行的時(shí)候會(huì)發(fā)射子彈,所以要添加子彈,同時(shí)發(fā)射子彈的時(shí)候還有子彈的音效</p
53、><p> CocosDenshion::SimpleAudioEngine::sharedEngine()->playEffect("sound/bullet.mp3");</p><p> CCSprite* bullet=CCSprite::createWithSpriteFrameName("bullet1.png");</p&g
54、t;<p> bulletBatchNode->addChild(bullet);</p><p> //this->addChild(bullet);</p><p> this->m_pAllBullet->addObject(bullet);</p><p> CCPoint planePosition=Plane
55、Layer::sharedPlane->getChildByTag(AIRPLANE)->getPosition();</p><p> CCPoint bulletPosition=ccp(planePosition.x,planePosition.y+PlaneLayer::sharedPlane->getChildByTag(AIRPLANE)->getContentSize().
56、height/2);</p><p> bullet->setPosition(bulletPosition);</p><p> float length=CCDirector::sharedDirector()->getWinSize().height+bullet->getContentSize().height/2-bulletPosition.y;</
57、p><p> float velocity=320/1;//320pixel/sec</p><p> float realMoveDuration=length/velocity;</p><p> CCFiniteTimeAction* actionMove=CCMoveTo::create(realMoveDuration,ccp(bulletPositio
58、n.x,CCDirector::sharedDirector()->getWinSize().height+bullet->getContentSize().height/2));</p><p> CCFiniteTimeAction* actionDone=CCCallFuncN::create(this,callfuncN_selector(BulletLayer::bulletMoveFin
59、ished));</p><p> CCSequence* sequence=CCSequence::create(actionMove,actionDone,NULL);</p><p> bullet->runAction(sequence);</p><p> 由于子彈的發(fā)射是有間隔的,設(shè)置一個(gè)schedule,有規(guī)律的調(diào)用AddBullet函數(shù),
60、是子彈發(fā)射;</p><p> void BulletLayer::StartShoot(float delay)</p><p><b> {</b></p><p> this->schedule(schedule_selector(BulletLayer::AddBullet),0.20f,kCCRepeatForever,d
61、elay);</p><p><b> }</b></p><p> void BulletLayer::StopShoot()</p><p><b> {</b></p><p> this->unschedule(schedule_selector(BulletLayer::Ad
62、dBullet));</p><p><b> }</b></p><p><b> 5.2.5敵機(jī)類</b></p><p> 游戲里要有敵人,添加敵機(jī),敵機(jī)要根據(jù)時(shí)間添加,,防止出現(xiàn)一大群敵機(jī)同時(shí)出現(xiàn)</p><p><b> //初始化</b></p>
63、<p> bool CWXEnemyManager::Init( CCTexture2D* pTexture,float fSpeed,int nCD,int nScore,int nHp,Receiver* pReceiver )</p><p><b> {</b></p><p><b> do</b></p>
64、;<p><b> {</b></p><p> //對(duì)敵人的屬性賦值</p><p> m_nScore = nScore;</p><p> m_nHp = nHp;</p><p> m_pReceiver = pReceiver;</p><p> m_nCD =
65、 nCD;</p><p> m_nCDTime = m_nCD;</p><p> m_pTexture = pTexture;</p><p> m_fSpeed = fSpeed;</p><p> return true;</p><p> } while (false);</p>&l
66、t;p> CCLog("Fun EnemyManager::Init Error!");</p><p> return false;</p><p><b> }</b></p><p> //判斷是否創(chuàng)建敵人</p><p> void CWXEnemyManager::Enemy
67、ManagerLoop()</p><p><b> {</b></p><p> if (IsCreate())</p><p><b> {</b></p><p><b> Create();</b></p><p><b>
68、}</b></p><p><b> }</b></p><p> //更新創(chuàng)建敵人時(shí)間</p><p> bool CWXEnemyManager::IsCreate()</p><p><b> {</b></p><p> if (m_nCD==0
69、)</p><p><b> {</b></p><p> m_nCD = m_nCDTime;</p><p> return true;</p><p><b> }</b></p><p><b> else</b></p>
70、<p><b> {</b></p><p><b> m_nCD--;</b></p><p> return false;</p><p><b> }</b></p><p><b> }</b></p><
71、p> //根據(jù)敵人屬性創(chuàng)建敵人</p><p> void CWXEnemyManager::Create()</p><p><b> {</b></p><p> CCSize PlaneSize = m_pTexture->getContentSize();</p><p> EnemyFor
72、CreateMsg Info;</p><p> Info.nScore = m_nScore;</p><p> Info.nHp = m_nHp;</p><p> Info.pTexture = m_pTexture;</p><p> Info.fSpeed = m_fSpeed;</p><p>
73、//為了不讓敵機(jī)產(chǎn)生一半在屏幕外的情況。</p><p> Info.pStartPoint = CCPointMake(rand()%(int)(_SCREEN_WIDTH_ - PlaneSize.width)</p><p> + PlaneSize.width*0.5,</p><p> _SCREEN_HEIGHT_-1.f);</p>
74、<p><b> //發(fā)消息創(chuàng)建敵人</b></p><p> this->SendMsg(enMsgEnemyForCreate,&Info,sizeof(Info));</p><p> 5.2.6 敵機(jī)管理</p><p> 敵機(jī)與主角子彈碰撞后,要做碰撞檢測(cè)。同時(shí)發(fā)送消息消除敵機(jī),將發(fā)生了碰撞的敵機(jī)進(jìn)行
75、回收,把碰撞的子彈和敵機(jī)存入CCArray中,移除碰撞的子彈和敵機(jī)</p><p> void GameScene::detectionCrash()</p><p><b> {</b></p><p> CCArray* bulletsToDelete = CCArray::create();//創(chuàng)建一個(gè)CCArray,用以存放待刪除
76、的子彈,也就是此幀中被檢測(cè)到碰撞的子彈 </p><p> bulletsToDelete->retain();//必須調(diào)用retain,CCArray內(nèi)部調(diào)用了autoRelease</p><p> CCObject* bt,*et;</p><p> CCArray* enemyToDelete = CCArray::create
77、();//創(chuàng)建一個(gè)CCArray,用以存放待刪除的敵機(jī),也就是此子彈擊中的敵機(jī)</p><p> enemyToDelete->retain();//調(diào)用retain </p><p> CCRect rectHero = this->heroLayer->getHero()->boundingBox();</p><p&
78、gt; float x = rectHero.origin.x + rectHero.size.width * 0.3;</p><p> float y = rectHero.origin.y + rectHero.size.height * 0.4;</p><p> float width = rectHero.size.width * 0.3;</p><
79、p> float height = rectHero.size.height * 0.6;</p><p> CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);</p><p> //檢測(cè)敵機(jī)和hero是否相撞</p><p> CCARRAY_FOREACH(this->ene
80、myLayer->m_enemys,et)//遍歷所有敵機(jī)</p><p><b> {</b></p><p><b> //break;</b></p><p> Enemy* enemy = (Enemy*)et;</p><p> if (enemy->getLife()
81、 == 0)</p><p><b> {</b></p><p><b> break;</b></p><p><b> }</b></p><p> // CCPoint rect1 = this->heroLayer->getHero()-&g
82、t;getPosition();</p><p> //boundingBox 獲取的是相對(duì)于父節(jié)點(diǎn)的左下角為原點(diǎn)的一個(gè)rect,所以要比較兩個(gè)精靈是否相交,他們的父節(jié)點(diǎn)的坐標(biāo)原點(diǎn)和大小應(yīng)該一樣</p><p> if(enemy->boundingBox().intersectsRect(rect_HeroForCrash))</p><p><b
83、> {</b></p><p> this->heroLayer->setIsHeroLive(false);</p><p> this->heroLayer->setHeroLifes(this->heroLayer->getHeroLifes() - 1);</p><p> enemyLayer-
84、>stopTakeEnemy();</p><p> enemyLayer->bomb(enemy);</p><p> enemyLayer->removeAllEnmeys();</p><p> SimpleAudioEngine::sharedEngine()->pauseBackgroundMusic();</p>
85、<p> int tempHightScore = GameScene::getHightestScore();</p><p> if (this->m_totalScore > tempHightScore)</p><p><b> {</b></p><p> GameScene::saveHighte
86、stScore(this->m_totalScore);</p><p><b> }</b></p><p> char life[64];</p><p> sprintf(life, "%d", this->heroLayer->getHeroLifes());</p><p
87、> CCLabelTTF* lbLife = (CCLabelTTF*)this->getChildByTag(tagOfLife);</p><p> lbLife->setString(life);</p><p> this->heroLayer->heroBomb(0.1f);</p><p> if (this->
88、;heroLayer->getHeroLifes() == 0)</p><p><b> {</b></p><p> this->scheduleOnce(schedule_selector(GameScene::gameOverCallback), 2.0f);</p><p><b> }</b>
89、</p><p><b> else</b></p><p><b> {</b></p><p> this->scheduleOnce(schedule_selector(GameScene::newLife), 2.0f);</p><p><b> }</b&g
90、t;</p><p><b> return;</b></p><p><b> }</b></p><p><b> }</b></p><p> //檢測(cè)敵機(jī)和子彈是否相撞</p><p> CCARRAY_FOREACH(this->
91、;heroLayer->getBullets()->m_bullets,bt)//遍歷所有子彈</p><p><b> {</b></p><p> CCSprite* bullet = (CCSprite*)bt;</p><p> CCARRAY_FOREACH(this->enemyLayer->m_ene
92、mys,et)//遍歷所有敵機(jī)</p><p><b> {</b></p><p> Enemy* enemy3 = (Enemy*)et;</p><p> if(enemy3->boundingBox().intersectsRect(bullet->boundingBox()))</p><p>
93、;<b> {</b></p><p> if (enemy3->getLife() > 1)</p><p><b> {</b></p><p> enemy3->loseLife();</p><p> bulletsToDelete->addObject(b
94、ullet);//把待刪除子彈放入CCArray </p><p><b> }</b></p><p> else if (enemy3->getLife() == 1)</p><p><b> {</b></p><p> enemy3->loseLif
95、e();</p><p> bulletsToDelete->addObject(bullet);//把待刪除子彈放入CCArray </p><p> enemyToDelete->addObject(enemy3);//把待刪除敵機(jī)放入CCArray </p><p> this->m_totalSc
96、ore += enemy3->getScore();</p><p> char str1[20];</p><p> sprintf(str1, "%d",(int)this->m_totalScore);</p><p> CCLabelTTF* label1 = (CCLabelTTF*)this->getChild
97、ByTag(tagOfScore);</p><p> label1->setString(str1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>&l
98、t;b> }</b></p><p> CCARRAY_FOREACH(enemyToDelete,et)//遍歷所有此幀中碰撞死亡的敵機(jī),必須是死亡</p><p><b> {</b></p><p> CCSprite* enemy3 = (CCSprite*)et;</p><p>
99、this->enemyLayer->bomb(enemy3);//執(zhí)行爆炸</p><p><b> }</b></p><p> enemyToDelete->release();//release</p><p> CCARRAY_FOREACH(bulletsToDelete,bt)//遍歷所有此幀中碰撞的子彈&l
100、t;/p><p><b> {</b></p><p> CCSprite* bullet = (CCSprite*)bt;</p><p> this->heroLayer->getBullets()->removeBullet(bullet);//執(zhí)行移除</p><p><b> }
101、</b></p><p> bulletsToDelete->release();//release</p><p><b> }</b></p><p> bullet是加到 ccspriteBatchNode 上的,ccspriteBatchNode是加到 BulletLayer上面的,ccspriteBatchNo
102、de和bulletLayer都是鋪滿屏幕的。所以子彈調(diào)用 boundingbox 獲得的矩形是以屏幕左下角為原點(diǎn)的。敵機(jī)的原理也是如此。hero是直接加到 herolayer 上的,父節(jié)點(diǎn)同樣是鋪滿屏幕的,所以他們的父節(jié)點(diǎn)的左下角的坐標(biāo)都一樣的,這就是通過(guò) boundingbox 檢測(cè)他們是否碰撞的前提。有些紋理周圍有比較大的空白地方,這就會(huì)造成兩個(gè)節(jié)點(diǎn)看起來(lái)還沒有接觸就會(huì)發(fā)生碰撞,這就需要對(duì)碰撞進(jìn)行更精確的判斷,可以通過(guò)什么像素判斷法
103、之類的。我這里采取最簡(jiǎn)單的處理方法,就是通過(guò)節(jié)點(diǎn)的boundingbox獲取到一個(gè)rect,然后對(duì)這個(gè)rect加工一下,這樣子可以獲取節(jié)點(diǎn) boundingbox 里面的某一部分來(lái)作為碰撞的檢測(cè)部分。</p><p> CCRect rectHero = this->heroLayer->getHero()->boundingBox();</p><p> float
104、 x = rectHero.origin.x + rectHero.size.width * 0.3;</p><p> float y = rectHero.origin.y + rectHero.size.height * 0.4;</p><p> float width = rectHero.size.width * 0.3;</p><p> flo
105、at height = rectHero.size.height * 0.6;</p><p> CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);</p><p> 5.2.7 觸摸事件</p><p> virtual bool ccTouchBegan (cocos2d::CCTouch
106、 *pTouch, cocos2d::CCEvent *pEvent);</p><p> virtual void ccTouchMoved (cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);</p><p> virtual void ccTouchEnded (cocos2d::CCTouch *pTouch, cocos2
107、d::CCEvent *pEvent);</p><p><b> 觸摸事件;</b></p><p> 5.2.8 游戲結(jié)束場(chǎng)景</p><p> 游戲最后結(jié)束需要保存分?jǐn)?shù)并退出,退出界面如圖5.2.8:</p><p><b> 圖5.2.8</b></p><p&g
108、t;<b> //退出按鈕</b></p><p> CCMenuItemImage *pExitItem=CCMenuItemImage::create(</p><p> "exit_game_n.png",</p><p> "exit_game_d.png",</p><
109、;p><b> this,</b></p><p> menu_selector(CWXBeginSceneLayer::menuExitCallback));</p><p> CC_BREAK_IF(!pExitItem);</p><p> pExitItem->setPosition(ccp(_SCREEN_WIDT
110、H_/2,_SCREEN_HEIGHT_/2-260.f));</p><p><b> 第6章 學(xué)習(xí)心得</b></p><p> 學(xué)習(xí)cocos以后對(duì)于內(nèi)存有了一些自己的見解,在C++中,在堆上分配動(dòng)態(tài)內(nèi)存和釋放動(dòng)態(tài)內(nèi)存的方法是 new 和 delete,在申請(qǐng)內(nèi)存之后,如果不使用了就需要delete掉,不然就會(huì)造成內(nèi)存的溢出。附錄:new的動(dòng)態(tài)內(nèi)存,只要在
111、程序結(jié)束之前delete就 行,這樣在程序結(jié)束之前就可以把申請(qǐng)到的堆內(nèi)存返還給系統(tǒng),但是在實(shí)際的編程過(guò)程中,一般為了及時(shí)釋放不用的空間提高內(nèi)存的使用率而在不需要的位置調(diào)用 delete來(lái)釋放,以免造成內(nèi)存占用過(guò)高和程序結(jié)束之前忘掉,從而造成的內(nèi)存溢出。</p><p> 在cosos2d-x中,對(duì)于引擎本身而言,自帶了autorelease 方法,可以將對(duì)象的指針加入push到自動(dòng)釋放池中。在每一幀結(jié)束的時(shí)候調(diào)
112、用pop對(duì)池中的對(duì)象指針執(zhí)行 退出自動(dòng)釋放池,并且根據(jù)引用計(jì)數(shù)來(lái)實(shí)現(xiàn)自動(dòng)釋放。</p><p> cocos2d-x官方推薦的生成對(duì)象方式 是使用CREATE_FUNC宏,宏中已經(jīng)有一個(gè)autorelease()調(diào)用,所以只需要直接 className *pObject = className::create(),調(diào)用就行,如果需要使用內(nèi)存自動(dòng)管理的功能,需要直接或間接繼承CCObject類就行。當(dāng)你加入以 后
113、,基本不需要對(duì)該對(duì)象的指針進(jìn)行釋放之類的操作,當(dāng)然是沒進(jìn)行pObject->retain()(需要再執(zhí)行 pObject->release())操作。很方便的管理了需要在堆上分配的內(nèi)存。推薦使用autorelease()來(lái)管理對(duì)內(nèi)存的釋放。</p><p> 其次,對(duì)于分配的內(nèi)存有當(dāng)前類數(shù)據(jù)成員和局部作用域中的局部對(duì)象的指針,類數(shù)據(jù)成員直接autorelease(),在類的生命周期結(jié)束時(shí),類的析構(gòu)函
114、數(shù) 中不需要再次釋放了,因?yàn)橐孀詣?dòng)幫你釋放了,對(duì)于局部的對(duì)象的指針,調(diào)用autorelease()后也不需要再次去釋放了,都交給引擎去釋放吧。</p><p> 最后,對(duì)于手動(dòng)操作而言 new操作和delete操作成對(duì)出現(xiàn)就行,類數(shù)據(jù)成員則在析構(gòu)函數(shù)中delete,以免提前釋放了,造成內(nèi)存操作錯(cuò)誤。再者如果執(zhí)行className *pObject = new className(); pObjec
115、t->autorelease()亦可使用引擎的內(nèi)存管理功能,前提是className直接或間接繼承自CCObject類。</p><p> 第7章 項(xiàng)目總結(jié)與展望</p><p> 在這次畢業(yè)設(shè)計(jì)的制作過(guò)程中,我強(qiáng)烈感覺到自己知識(shí)的貧乏,和對(duì)以往學(xué)習(xí)過(guò)的知識(shí)掌握不夠。從最初的茫然,到慢慢的進(jìn)入狀態(tài),再到對(duì)思路逐漸的清晰,整個(gè)過(guò)程難以用語(yǔ)言來(lái)表達(dá)。緊張而又充實(shí)的畢業(yè)設(shè)計(jì)終于落下了
116、帷幕。回想這段日子的經(jīng)歷和感受,我感慨萬(wàn)千,在這次畢業(yè)設(shè)計(jì)的過(guò)程中,我擁有了無(wú)數(shù)難忘的回憶和收獲。當(dāng)選題定下來(lái)的時(shí)候,我當(dāng)時(shí)便立刻著手資料的收集工作中,將搜索到的資料全部?jī)?chǔ)存起來(lái),盡量使我的資料完整、精確、數(shù)量多,這有利于畢業(yè)設(shè)計(jì)的開發(fā)。然后我將收集到的資料仔細(xì)整理分類。資料已經(jīng)查找完畢了,我開始著手開發(fā)。在研究的工作過(guò)程中遇到困難我就請(qǐng)教老師,并和同學(xué)互相交流討論,還請(qǐng)教了在職的游戲和軟件開發(fā)的人員。在大家的幫助下,困難一個(gè)一個(gè)解決掉
117、,項(xiàng)目也慢慢成型。經(jīng)過(guò)多次測(cè)試和仔細(xì)修改,游戲終于完成了。整個(gè)過(guò)程中,從需求分析到設(shè)計(jì)、編碼、測(cè)試,我都力求規(guī)范化和文檔化,努力讓自己以前學(xué)的知識(shí)運(yùn)用到本游戲的開發(fā)中,盡量保證整個(gè)項(xiàng)目的開發(fā)進(jìn)度和質(zhì)量,順利完成這次的畢業(yè)設(shè)計(jì),為自己的大學(xué)生涯畫上一個(gè)完美的句號(hào)。在這個(gè)過(guò)程中,我們遇到了很多困難,例如對(duì)數(shù)據(jù)結(jié)構(gòu)的不熟悉,分?jǐn)?shù)增加,音效、圖片資源的添加,編寫的錯(cuò)誤</p><p><b> 參考文獻(xiàn)<
118、;/b></p><p> [1] 李華明 《iOS游戲編程之從零開始-Cocos2d-x與cocos2d引擎游戲開發(fā)》清華出版社</p><p> [2] 滿碩泉《Cocos2D-x權(quán)威指南》機(jī)械工業(yè)出版社</p><p> [3] 劉劍卓《Cocos2D-X游戲開發(fā)技術(shù)精解》人民郵電出版社</p><p> [6]鐘迪龍 《
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于cocos2d-x的跨平臺(tái)游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)論文
- 基于Cocos2d-x引擎的跨平臺(tái)游戲設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于COCOS2D-X引擎跨平臺(tái)手機(jī)游戲設(shè)計(jì)與實(shí)現(xiàn).pdf
- 【資料下載】基于cocos2d-x的跨平臺(tái)游戲的設(shè)計(jì)與實(shí)現(xiàn)畢業(yè)設(shè)計(jì)論文【原創(chuàng)精品】
- 畢業(yè)論文-基于cocos2d-x游戲引擎的飛行射擊類游戲設(shè)計(jì)與實(shí)現(xiàn)
- 基于cocos2d-x跨平臺(tái)引擎的趣味籃球游戲設(shè)計(jì)與開發(fā).pdf
- 基于cocos2d-x的飛行射擊類游戲-畢業(yè)論文
- 《基于cocos2d-x跨平臺(tái)的ios游戲飛機(jī)大戰(zhàn)設(shè)計(jì)》畢業(yè)論文電子稿及源代碼
- 基于Cocos2d-x移動(dòng)平臺(tái)跑酷類游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于cocos2d-x網(wǎng)絡(luò)對(duì)答游戲設(shè)計(jì)與實(shí)現(xiàn).pdf
- 《基于cocos2d-x跨平臺(tái)的ios游戲飛機(jī)大戰(zhàn)設(shè)計(jì)》畢業(yè)論文電子稿及源代碼
- 基于Cocos2d-X的手機(jī)格斗游戲設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Cocos2d-x引擎的移動(dòng)平臺(tái)捕魚類游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Cocos2d-x的手機(jī)游戲坦克大戰(zhàn)的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Cocos2d-x的RPG手機(jī)游戲開發(fā).pdf
- 基于Cocos2d-x引擎的動(dòng)作類游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Cocos2d-x引擎手機(jī)游戲?qū)嵱?xùn)平臺(tái)的設(shè)計(jì)及應(yīng)用.pdf
- 基于Cocos2d-x引擎捕魚達(dá)人多人游戲功能的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 一款基于Cocos2d-X引擎的射擊游戲的設(shè)計(jì)與實(shí)現(xiàn).pdf
- 基于Cocos2d-x引擎的手機(jī)游戲2048及其AI的設(shè)計(jì)與實(shí)現(xiàn).pdf
評(píng)論
0/150
提交評(píng)論