基于Cocos2D-X的跨平臺游戲的設計與實現(xiàn)畢業(yè)論文_第1頁
基于Cocos2D-X的跨平臺游戲的設計與實現(xiàn)畢業(yè)論文_第2頁
基于Cocos2D-X的跨平臺游戲的設計與實現(xiàn)畢業(yè)論文_第3頁
基于Cocos2D-X的跨平臺游戲的設計與實現(xiàn)畢業(yè)論文_第4頁
基于Cocos2D-X的跨平臺游戲的設計與實現(xiàn)畢業(yè)論文_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 畢畢 業(yè)業(yè) 設設 計計題目題目基于基于 Cocos2D-XCocos2D-X 的跨平臺游戲的設計與實現(xiàn)的跨平臺游戲的設計與實現(xiàn)姓 名 學 號 系(院) 班 級 指導教師 職 稱 二 O 一四 年 五 月 二十 日 畢業(yè)設計(論文)答辯評審表畢業(yè)設計(論文)答辯評審表課題名稱課題名稱基于基于 Cocos2d-X 的跨平臺游戲的設計與實現(xiàn)的跨平臺游戲的設計與實現(xiàn)學生姓名學生姓名 指導教師指導教師簽名簽名答辯小組答辯小組評分評分評語:評語:答辯小組負責人簽字:答辯小組負責人簽字:年年 月月 日日答辯答辯小組小組成員成員簽簽 名名畢業(yè)設計(論文)成績評定表畢業(yè)設計(論文)成績評定表指導教師評分(指導

2、教師評分(30分)分)評閱人評分(評閱人評分(30 分)分)答辯評分(答辯評分(40 分)分)綜合成績綜合成績答辯委員會負責人簽字:答辯委員會負責人簽字:年年 月月 日日淄博職業(yè)學院信息工程系畢業(yè)設計目目 錄錄第一章緒論 .41.1 手游背景.41.2 發(fā)展趨勢.41.3 研究意義.41.4 不足之處.5第二章相關技術 .62.1 C+語言.62.2 COCOS2D-X 平臺技術介紹 .62.3 開發(fā)工具 .7第三章設計概要 .83.1 游戲介紹.83.2 游戲的結構例圖 .83.3 功能模塊分析圖 .103.3.1 游戲歡迎頁面.103.3.2 游戲主頁面.103.4 游戲失敗 .11第四章

3、項目設計 .124.1 游戲架構設計.12第五章項目實現(xiàn) .135.1 游戲總體實現(xiàn) .135.2 各模塊實現(xiàn) .135.2.1 功能的實現(xiàn)依賴 .135.2.2 游戲主歡迎頁的實現(xiàn).135.2.3 游戲主場景 .155.2.4 游戲主角類 .165.2.5 敵機類 .175.2.6 敵機管理.195.2.7 觸摸事件.225.2.8 游戲結束場景.23第六章學習心得 .24第七章項目總結與展望 .25參考文獻 .26淄博職業(yè)學院信息工程系畢業(yè)設計1第第 1 1 章章 緒論緒論1.11.1 手游背景手游背景手游指在手機等各類手持硬件設備上運行的游戲類應用程序,其需要具備一定硬件環(huán)境和一定系統(tǒng)級

4、程序作為運行基礎。2004 年,手機游戲均為 WAP 游戲,到 2005 年,圖形化手機游戲激增,已經超過 40 余 款。2005 年 6 月,盛大英特爾宣布攜手共同開發(fā)國內手機游戲市場,手機網游行業(yè)陣營開始空前壯大,繼盛大、北京掌訊、美通之后,網易、空中,標派等也紛 紛加入,目前國內手機游戲廠商已經近 30 家。手機游戲尚處于市場導入期,在未來幾年內,手機游戲將步入快速發(fā)展階段。1.21.2 發(fā)展趨勢發(fā)展趨勢近年來,隨著智能機的普及以及 3G 的覆蓋率增加,手機網游日益興起,現(xiàn)已經有近兩千萬的手機網游玩家了。2014 年,國內移動互聯(lián)網競爭格局未定,運營商拒絕管道化欲謀更多話語權,轉型力度、

5、資源投入日趨加大;在部分細分領域,圍繞運營商轉型的業(yè)務和渠道價 值驟然放大,引發(fā)產業(yè)整合日趨頻繁。在此背景下,國內移動互聯(lián)龍頭拓維信息通過多年技術積累及運營商渠道優(yōu)勢,確定以手機動漫與游戲業(yè)務為兩大核心發(fā)展方 向之一。1.31.3 研究意義研究意義全球在使用的移動電話已經超過 10 億部,而且這個數(shù)字每天都在不斷增加。在除美國外的各個發(fā)達國家,手機用戶都比計算機用戶多。手機游戲潛在的市場比其他任何平臺,比如 PlayStation 和 GameBoy 都要大。在控制臺游戲時代,GameBoy 熱銷的一個原因就是便攜性人們可以隨時隨 地沉浸在自己喜歡的游戲中,還可以隨時隨地搶購自己喜歡的裝備或寵

6、物。和游戲控制臺或者 PC 相比,手機雖然可能不是一個理想的游戲設備,但畢竟人們總是隨 時隨身攜帶,這樣手機游戲很可能成為人們消遣時間的首選。手機便攜性、移動性的特征更能滿足用戶隨時隨地玩游戲的需求,用戶利用排隊、等車的時間進行游 戲,手機游戲碎片化的特性凸顯。調查顯示,29.8%的用戶在用手機玩游戲以后電腦端玩游戲的時間減少,手機游戲已經開始搶奪電腦游戲時間。22.4%的 用戶手機游戲時間越來越長,僅有 10%的用戶時間變短,手機游戲已逐漸成為一種普遍的娛樂方式。因為手機是網絡設備,在一定限制因素下可以實現(xiàn)多人在線游戲。隨著移動網絡的發(fā)展,移 動游戲也越來越多的被大家接受,對于之前長期通知市

7、場的掌機來淄博職業(yè)學院信息工程系畢業(yè)設計2說造成了不少的沖擊。市場研究公司 IDC 和 App Annie 報告顯示 2013 年第一季度 iOS和 Android 平臺游戲業(yè)務營收是掌機的 3 倍。手機游戲市場潛力大,投入資金少,吸引了很多市場進入者,但中小 SP 在激烈的競爭中生存問題是需要考慮的主要問題。手機游戲開發(fā)商、游戲應及服務提供商不重視市場宣傳和推廣工作,忽視對于游戲產品,用戶的體驗和習慣培養(yǎng)重要性。手機游戲市場競爭激烈,該競爭涉及國內,也涉及國外游戲開發(fā)商。追求低成本和短期利益,現(xiàn)游戲產品的質量粗糙。手機游戲的同質化也越來越嚴重,創(chuàng)新力不足。淄博職業(yè)學院信息工程系畢業(yè)設計3 第

8、第 2 2 章章 相關設計相關設計2.12.1 C+C+語言語言C+語言是一種使用非常廣泛的計算機編程語言。是一種靜態(tài)數(shù)據(jù)類型檢查的、支持多重編程范式的通用程序設計語言。它支持過程化程序設計、數(shù)據(jù)抽象、面向對象程序設計、泛型程序設計等多種程序設計風格。C+在一定程度上可以和 C 語言很好的結合,甚至大多數(shù) C 語言程序是在 C+的集成開發(fā)環(huán)境中完成的。C+相對眾多的面向對象的語言,具有相當高的性能。C+引入了面向對象的概念,使得開發(fā)人機交互類型的應用程序更為簡單、快捷。很多優(yōu)秀的程序框架包括 MFC、QT 就是使用的 C+。C+避免平臺限定或沒有普遍用途的特性。C+不使用會帶來額外開銷的特性。

9、C+設計成無需復雜的程序設計環(huán)境。2.22.2 Cocos2D-XCocos2D-X 平臺技術介紹平臺技術介紹cocos2d 是一個基于 MIT 協(xié)議的開源框架,用于構建游戲、應用程序和其他圖形界面交互應用。這是一個 C+ Cocos2d-iPhone 項目的版本。Cocos2d-X 發(fā)展的重點是圍繞Cocos2d 跨平臺,Cocos2d-x 提供的框架。手機游戲,可以寫在 C+或者 Lua 中,使用API 是 Cocos2d-iPhone 完全兼容。Cocos2d-x 項目可以很容易地建立和運行在IOS,Android,黑莓 Blackberry 等操作系統(tǒng)中。Cocos2d-x 還支持 W

10、indows、Mac 和Linux 等桌面操作系統(tǒng),因此,開發(fā)者編寫的源代碼很容易在桌面操作系統(tǒng)中編輯和調試。Cocos2D-X 主要功能:流程控制(Flow control):非常容易地管理不同場景(scenes)之間的流程控制;精靈(Sprites):快速而方便的精靈;動作(Actions):告訴精靈們該做什么??山M合的動作如移動(move) 、旋轉(rotate)和縮放(scale)等更多;特效(Effects):特效包括波浪(waves) 、旋轉(twirl)和透鏡(lens)等更多;平面地圖(Tiled Maps):支持包括矩形和六邊形平面地圖;轉換(Transitions):從一個

11、場景移動到另外一個不同風格的場景;菜單(Menus):創(chuàng)建內部菜單;文本渲染(Text Rendering):支持標簽和 HTML 標簽動作;文檔(Documents):編程指南 + API 參考 + 視頻教學 + 很多教用戶如何使用的簡單測試例子;MIT 許可:盡管用就是了;基于 Pyglet:沒有外部的依賴;基于 OpenGL:支持硬件加速;3D 對象:MD2 模型支持;腳本語言:支持 Lua,JavaScript 語言。淄博職業(yè)學院信息工程系畢業(yè)設計4圖 2.2 Cocos2D-X 引擎架構2.32.3 開發(fā)工具開發(fā)工具游戲在 Windows XP 系統(tǒng)下開發(fā),基于 visual stu

12、dio C+ 2008 的開發(fā)平臺,采用了cocos2d-x 技術進行開發(fā)。操作系統(tǒng):Microsoft Windows 7程序語言:C+開發(fā)工具:Microsoft Visval Studio 2012,cocos2d-x-2.2.2Microsoft Visual C+, (簡稱 Visual C+、MSVC、VC+或 VC)微軟公司的 C+開發(fā)工具,具有集成開發(fā)環(huán)境,可提供編輯 C 語言,C+以及 C+等編程語言。Visual C+以擁有“語法高亮” ,IntelliSense(自動編譯功能)以及高級除錯功能而著稱。比如,它允許用戶進行遠程調試,單步執(zhí)行等。還有允許用戶在調試期間重新編譯

13、被修改的代碼,而不必重新啟動正在調試的程序。其編譯及建置系統(tǒng)以預編譯頭文件、最小重建功能及累加鏈接著稱。這些特征明顯縮短程序編輯、編譯及鏈接的時間花費,在大型軟件計劃上尤其顯著。C+語言是目前面向對象編程的首選語言,學習、使用C+語言并進行應用程序設計的人員非常多,Microsoft 公司的 Visual C+2008 因其強大的功能、非常友好的界面而成為當前最為熱門C+語言開發(fā)環(huán)境。Visual C+提供的集成開發(fā)環(huán)境、MFC 類庫和應用程序框架極大地便利了用C+語言開發(fā) Windows 應用程序所需的源代碼編寫、用戶界面設計、消息映射、編譯鏈接和調試運行等工作。第第 3 3 章章 設計概要

14、設計概要3.3.1 1 游戲介紹游戲介紹這是一款飛行射擊類游戲,整體環(huán)境主要還是圍繞太空為主,高保真的音效,為玩家呈現(xiàn)一場不一樣射擊體驗。簡單的觸屏操 作,觸屏按住隨意一個地方,左右移動,便可自動攻擊敵人,上下移動亦可躲避強敵。在飛機的左下角還有兩個道具槽,直接點淄博職業(yè)學院信息工程系畢業(yè)設計5擊就可以發(fā)動道具效果,前提是你必 須要吃到道具。玩家在游戲中要做的就是駕駛著最新戰(zhàn)機,在敵機身前發(fā)動攻擊。在擊毀敵機的同時獲得分數(shù),擊毀的敵機越多,則相對的獲得分數(shù)就越高。玩家進行游戲的時候需要注意不能被敵機及敵機子彈碰到,否則玩家控制角色死亡,同時游戲結束。記錄玩家獲取的積分。3.3.2 2 游戲的結

15、構例圖游戲的結構例圖游戲的結構例圖如圖 3.2 所示:圖 3.2游戲的結構圖例圖3.33.3 功能模塊分析功能模塊分析圖圖游戲功能模塊主體分析:淄博職業(yè)學院信息工程系畢業(yè)設計.1 游戲歡迎頁面游戲歡迎頁面游戲歡迎頁面主要是預加載游戲進行需要的圖片、音樂等資源進行預加載。3.3.2 游戲主頁面游戲主頁面游戲主頁面邏輯判斷如圖 3.3 所示。圖 3.3游戲主頁面邏輯判斷圖道具使用邏輯圖如下:淄博職業(yè)學院信息工程系畢業(yè)設計7圖 3.3 道具使用邏輯圖3.43.4 游戲失敗游戲失敗游戲失敗邏輯圖圖 3.4 游戲失敗邏輯圖淄博職業(yè)學院信息工程系畢業(yè)設計8第第 4 4 章章 項目設計項目

16、設計4.14.1 游戲架構設計游戲架構設計由項目的需求分析可以清晰的對本游戲的具體功能實現(xiàn)進行設計,如下圖 4.1 是本游戲的總體架構設計。圖 4.1 游戲總體構架設計通過對游戲的需求進行分析和細致的歸納,可以認為游戲的主要內容是由游戲進行時和游戲失敗兩個主要部分所構成。游戲進行時包含了用戶對主角的操作以及對主角信息(獲得的分數(shù)及獲取的道具)的管理,用戶游戲結束的操作選擇,游戲進行為本系統(tǒng)的設計核心。基于這些考慮,本游戲將對游戲進行時的事件作為一個重點的功能模塊進行詳細設計。淄博職業(yè)學院信息工程系畢業(yè)設計9第第 5 5 章章 項目實現(xiàn)項目實現(xiàn)前四章是對游戲的邏輯和功能上的設計,而游戲實現(xiàn)階段就

17、要依據(jù)之前的成果將抽象化設計轉化為物理實現(xiàn)。5.15.1 游戲總體實現(xiàn)游戲總體實現(xiàn)游戲的模塊結構是對游戲的進行一個總體劃分,要真正的實現(xiàn)游戲,還需要進一步的設計用戶的功能。游戲的功能分為十類:游戲主場景、游戲歡迎頁、游戲主角類、游戲敵機類、子彈類、游戲場景類、游戲結束場景類、管理類、道具類、觸摸事件,針對每一個功能都實現(xiàn)了不同的作用。5.25.2 各模塊實現(xiàn)各模塊實現(xiàn)本文對貨單管理模塊、個人信息管理模塊、系統(tǒng)信息管理模塊中的功能具體實現(xiàn)過程進行論述。.1 功能功能的實現(xiàn)的實現(xiàn)依賴依賴項目創(chuàng)建的時候需要添加 cocos2d-x 的支持項,如圖 5.2.1,圖 5.2.1搭建好的工

18、程在第一次創(chuàng)建項目的時候會自動把需要的外部依賴項添加到項目下,不需要手動額外添加。需要注意的是,在開始一個項目的時候,要把需要用到的圖片資源以及音樂添加到項目目錄下,否則在項目進行的過程中會報錯。資源文件盡量不要用中文命名,有時會出現(xiàn)字符編碼的錯誤。.2 游戲主歡迎頁的實現(xiàn)游戲主歡迎頁的實現(xiàn)用戶在進去游戲的時候,會首先進入到歡迎頁面(圖 ) 。淄博職業(yè)學院信息工程系畢業(yè)設計10圖 歡迎頁是為了對資源,即圖片資源和音樂資源進行預加載,圖片資源和音樂資源相對較大,進入游戲后在加載比較慢,對游戲體驗會造成一定影響,所以在歡迎頁面進行預加載,進入游戲后可以享

19、受較好的體驗,不會因為加載資源而造成游戲卡的問題。加載資源代碼如下:/加載音樂資源PreloadMusic();void WelcomeLayer:PreloadMusic()CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadBackgroundMusic(sound/game_music.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/bullet.mp3);CocosDenshion:SimpleAudioEngine:sharedEng

20、ine()-preloadEffect(sound/enemy1_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/enemy2_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/enemy3_down.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/game_over.mp3);CocosDe

21、nshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/get_bomb.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/get_double_laser.mp3);淄博職業(yè)學院信息工程系畢業(yè)設計11CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/use_bomb.mp3);CocosDenshion:SimpleAudioEngine:sharedE

22、ngine()-preloadEffect(sound/big_spaceship_flying.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/achievement.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/out_porp.mp3);CocosDenshion:SimpleAudioEngine:sharedEngine()-preloadEffect(sound/button.mp3);Co

23、cosDenshion:SimpleAudioEngine:sharedEngine()-playBackgroundMusic(sound/game_music.mp3,true);這是做一個檢測,可以不添加,但是為了保證代碼的健壯性要添加:bool bRet=false;doCC_BREAK_IF(!CCLayer:init();、bRet=true; while (0);return bRet;.3 游戲主場景游戲主場景游戲主場景是為添加的精靈提供一個層,所有的精靈都是在這個層上進行添加。5.2.4 游戲主角類游戲主角類創(chuàng)建游戲主角后,然他在進入游戲后閃爍三次,主角在進行

24、飛行的時候讓尾巴的煙火一長一短,顯示正在飛行,這里是通過兩個圖片不斷交替顯示完成的。/創(chuàng)建 CCBlink 效果CCBlink *blink=CCBlink:create(1,3);/CCAnimation* animation=CCAnimation:create();淄博職業(yè)學院信息工程系畢業(yè)設計12/通過.png 和 .plist文件創(chuàng)建精靈表/animation-addSpriteFrame(CCSpriteFrameCache:sharedSpriteFrameCache()-spriteFrameByName(hero1.png);/animation-addSpriteFrame

25、(CCSpriteFrameCache:sharedSpriteFrameCache()-spriteFrameByName(hero2.png);/從本地文件系統(tǒng)中加載圖片文件到CCSpriteFrame中區(qū),然后添加到CCAnimation中for (int i = 1; i addSpriteFrameWithFileName(szImageFileName);CC_BREAK_IF(!animation);animation-setDelayPerUnit(0.1f);CCAnimate* animate=CCAnimate:create(animation);plane-runAct

26、ion(blink);plane-runAction(CCRepeatForever:create(animate);主角在飛行的時候會發(fā)射子彈,所以要添加子彈,同時發(fā)射子彈的時候還有子彈的音效CocosDenshion:SimpleAudioEngine:sharedEngine()-playEffect(sound/bullet.mp3);CCSprite* bullet=CCSprite:createWithSpriteFrameName(bullet1.png);bulletBatchNode-addChild(bullet);/this-addChild(bullet);this-m

27、_pAllBullet-addObject(bullet);CCPoint planePosition=PlaneLayer:sharedPlane-getChildByTag(AIRPLANE)-getPosition();CCPoint bulletPosition=ccp(planePosition.x,planePosition.y+PlaneLayer:sharedPlane-getChildByTag(AIRPLANE)-getContentSize().height/2);bullet-setPosition(bulletPosition);float length=CCDire

28、ctor:sharedDirector()-getWinSize().height+bullet-getContentSize().height/2-bulletPosition.y;float velocity=320/1;/320pixel/secfloat realMoveDuration=length/velocity;CCFiniteTimeAction* actionMove=CCMoveTo:create(realMoveDuration,ccp(bulletPosition.x,CCDirector:淄博職業(yè)學院信息工程系畢業(yè)設計13sharedDirector()-getWi

29、nSize().height+bullet-getContentSize().height/2);CCFiniteTimeAction* actionDone=CCCallFuncN:create(this,callfuncN_selector(BulletLayer:bulletMoveFinished);CCSequence* sequence=CCSequence:create(actionMove,actionDone,NULL);bullet-runAction(sequence);由于子彈的發(fā)射是有間隔的,設置一個schedule,有規(guī)律的調用AddBullet函數(shù),是子彈發(fā)射;v

30、oid BulletLayer:StartShoot(float delay)this-schedule(schedule_selector(BulletLayer:AddBullet),0.20f,kCCRepeatForever,delay);void BulletLayer:StopShoot()this-unschedule(schedule_selector(BulletLayer:AddBullet);5.2.5 敵機類敵機類游戲里要有敵人,添加敵機,敵機要根據(jù)時間添加, ,防止出現(xiàn)一大群敵機同時出現(xiàn)/初始化bool CWXEnemyManager:Init( CCTexture2

31、D* pTexture,float fSpeed,int nCD,int nScore,int nHp,Receiver* pReceiver )do/對敵人的屬性賦值m_nScore = nScore;m_nHp = nHp;m_pReceiver = pReceiver;m_nCD = nCD;m_nCDTime = m_nCD;m_pTexture = pTexture;m_fSpeed = fSpeed;return true; while (false);CCLog(Fun EnemyManager:Init Error!);淄博職業(yè)學院信息工程系畢業(yè)設計14return false

32、;/判斷是否創(chuàng)建敵人void CWXEnemyManager:EnemyManagerLoop()if (IsCreate()Create();/更新創(chuàng)建敵人時間bool CWXEnemyManager:IsCreate()if (m_nCD=0)m_nCD = m_nCDTime;return true;elsem_nCD-;return false;/根據(jù)敵人屬性創(chuàng)建敵人void CWXEnemyManager:Create()CCSize PlaneSize = m_pTexture-getContentSize();EnemyForCreateMsg Info;Info.nScore

33、= m_nScore;Info.nHp = m_nHp;Info.pTexture = m_pTexture;Info.fSpeed = m_fSpeed;/為了不讓敵機產生一半在屏幕外的情況。Info.pStartPoint = CCPointMake(rand()%(int)(_SCREEN_WIDTH_ - PlaneSize.width)+ PlaneSize.width*0.5,_SCREEN_HEIGHT_-1.f);/發(fā)消息創(chuàng)建敵人this-SendMsg(enMsgEnemyForCreate,&Info,sizeof(Info);淄博職業(yè)學院信息工程系畢業(yè)設計155.

34、2.6 敵機管理敵機管理敵機與主角子彈碰撞后,要做碰撞檢測。同時發(fā)送消息消除敵機,將發(fā)生了碰撞的敵機進行回收,把碰撞的子彈和敵機存入 CCArray 中,移除碰撞的子彈和敵機void GameScene:detectionCrash()CCArray* bulletsToDelete = CCArray:create();/創(chuàng)建一個CCArray,用以存放待刪除的子彈,也就是此幀中被檢測到碰撞的子彈 bulletsToDelete-retain();/必須調用retain,CCArray內部調用了autoReleaseCCObject* bt,*et;CCArray* ene

35、myToDelete = CCArray:create();/創(chuàng)建一個CCArray,用以存放待刪除的敵機,也就是此子彈擊中的敵機enemyToDelete-retain();/調用retain  CCRect rectHero = this-heroLayer-getHero()-boundingBox();float x = rectHero.origin.x + rectHero.size.width * 0.3;float y = rectHero.origin.y + rectHero.size.height * 0.4;float width = rectHero

36、.size.width * 0.3;float height = rectHero.size.height * 0.6;CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);/檢測敵機和hero是否相撞CCARRAY_FOREACH(this-enemyLayer-m_enemys,et)/遍歷所有敵機/break;Enemy* enemy = (Enemy*)et;if (enemy-getLife() = 0)break;/ CCPoint rect1 = this-heroLayer-getHero()-getPositio

37、n();/boundingBox 獲取的是相對于父節(jié)點的左下角為原點的一個rect,所以要比較兩個精靈是否相交,他們的父節(jié)點的坐標原點和大小應該一樣if(enemy-boundingBox().intersectsRect(rect_HeroForCrash)this-heroLayer-setIsHeroLive(false);this-heroLayer-setHeroLifes(this-heroLayer-getHeroLifes() - 1);淄博職業(yè)學院信息工程系畢業(yè)設計16enemyLayer-stopTakeEnemy();enemyLayer-bomb(enemy);enem

38、yLayer-removeAllEnmeys();SimpleAudioEngine:sharedEngine()-pauseBackgroundMusic();int tempHightScore = GameScene:getHightestScore();if (this-m_totalScore tempHightScore)GameScene:saveHightestScore(this-m_totalScore);char life64;sprintf(life, %d, this-heroLayer-getHeroLifes();CCLabelTTF* lbLife = (CCL

39、abelTTF*)this-getChildByTag(tagOfLife);lbLife-setString(life);this-heroLayer-heroBomb(0.1f);if (this-heroLayer-getHeroLifes() = 0)this-scheduleOnce(schedule_selector(GameScene:gameOverCallback), 2.0f);elsethis-scheduleOnce(schedule_selector(GameScene:newLife), 2.0f);return;/檢測敵機和子彈是否相撞CCARRAY_FOREAC

40、H(this-heroLayer-getBullets()-m_bullets,bt)/遍歷所有子彈CCSprite* bullet = (CCSprite*)bt;CCARRAY_FOREACH(this-enemyLayer-m_enemys,et)/遍歷所有敵機Enemy* enemy3 = (Enemy*)et;if(enemy3-boundingBox().intersectsRect(bullet-boundingBox()淄博職業(yè)學院信息工程系畢業(yè)設計17if (enemy3-getLife() 1)enemy3-loseLife();bulletsToDelete-addObj

41、ect(bullet);/把待刪除子彈放入CCArray  else if (enemy3-getLife() = 1)enemy3-loseLife();bulletsToDelete-addObject(bullet);/把待刪除子彈放入CCArray  enemyToDelete-addObject(enemy3);/把待刪除敵機放入CCArray this-m_totalScore += enemy3-getScore();char str120;sprintf(str1, %d,(int)this-m_totalScore);CC

42、LabelTTF* label1 = (CCLabelTTF*)this-getChildByTag(tagOfScore);label1-setString(str1);CCARRAY_FOREACH(enemyToDelete,et)/遍歷所有此幀中碰撞死亡的敵機,必須是死亡CCSprite* enemy3 = (CCSprite*)et;this-enemyLayer-bomb(enemy3);/執(zhí)行爆炸enemyToDelete-release();/releaseCCARRAY_FOREACH(bulletsToDelete,bt)/遍歷所有此幀中碰撞的子彈CCSprite* bul

43、let = (CCSprite*)bt;this-heroLayer-getBullets()-removeBullet(bullet);/執(zhí)行移除bulletsToDelete-release();/release淄博職業(yè)學院信息工程系畢業(yè)設計18bullet 是加到 ccspriteBatchNode 上的,ccspriteBatchNode 是加到 BulletLayer 上面的,ccspriteBatchNode 和 bulletLayer 都是鋪滿屏幕的。所以子彈調用 boundingbox 獲得的矩形是以屏幕左下角為原點的。敵機的原理也是如此。hero 是直接加到 herolaye

44、r 上的,父節(jié)點同樣是鋪滿屏幕的,所以他們的父節(jié)點的左下角的坐標都一樣的,這就是通過 boundingbox 檢測他們是否碰撞的前提。有些紋理周圍有比較大的空白地方,這就會造成兩個節(jié)點看起來還沒有接觸就會發(fā)生碰撞,這就需要對碰撞進行更精確的判斷,可以通過什么像素判斷法之類的。我這里采取最簡單的處理方法,就是通過節(jié)點的 boundingbox 獲取到一個 rect,然后對這個 rect 加工一下,這樣子可以獲取節(jié)點 boundingbox 里面的某一部分來作為碰撞的檢測部分。CCRect rectHero = this-heroLayer-getHero()-boundingBox();floa

45、t x = rectHero.origin.x + rectHero.size.width * 0.3;float y = rectHero.origin.y + rectHero.size.height * 0.4;float width = rectHero.size.width * 0.3;float height = rectHero.size.height * 0.6;CCRect rect_HeroForCrash = CCRectMake(x, y, width, height);5.2.7 觸摸事件觸摸事件virtual bool ccTouchBegan (cocos2d:C

46、CTouch *pTouch, cocos2d:CCEvent *pEvent);virtual void ccTouchMoved (cocos2d:CCTouch *pTouch, cocos2d:CCEvent *pEvent);virtual void ccTouchEnded (cocos2d:CCTouch *pTouch, cocos2d:CCEvent *pEvent);觸摸事件;5.2.8 游戲結束場景游戲結束場景游戲最后結束需要保存分數(shù)并退出,退出界面如圖 5.2.8:淄博職業(yè)學院信息工程系畢業(yè)設計19圖 5.2.8/退出按鈕CCMenuItemImage *pExitIt

47、em=CCMenuItemImage:create(exit_game_n.png,exit_game_d.png,this,menu_selector(CWXBeginSceneLayer:menuExitCallback);CC_BREAK_IF(!pExitItem);pExitItem-setPosition(ccp(_SCREEN_WIDTH_/2,_SCREEN_HEIGHT_/2-260.f);淄博職業(yè)學院信息工程系畢業(yè)設計20第第 6 6 章章 學習心得學習心得學習 cocos 以后對于內存有了一些自己的見解,在 C+中,在堆上分配動態(tài)內存和釋放動態(tài)內存的方法是 new 和 delete,在申請內存之后,如果不使用了就需要 delete掉,不然就會造成內存的溢出。附錄:new 的動態(tài)內存,只要在程序結束之前 delete 就 行,這樣在程序結束之前就可以把申請到的堆內存返還給系統(tǒng),但是在實際的編程過程中,一般為了及時釋放不用的空間提高內存的使用率而在不需要的位置調用 delete 來釋放,以免造成內存占用過高和程序結束之前忘掉,從而造成的內存溢出。在 c

溫馨提示

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

評論

0/150

提交評論