畢業(yè)論文基于cocos2dx游戲引擎的小雞對抗游戲開發(fā)_第1頁
畢業(yè)論文基于cocos2dx游戲引擎的小雞對抗游戲開發(fā)_第2頁
畢業(yè)論文基于cocos2dx游戲引擎的小雞對抗游戲開發(fā)_第3頁
畢業(yè)論文基于cocos2dx游戲引擎的小雞對抗游戲開發(fā)_第4頁
畢業(yè)論文基于cocos2dx游戲引擎的小雞對抗游戲開發(fā)_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

基于Cocos2d-x的小雞對抗游戲開發(fā)PAGE44目錄摘要 IIAbstract III1 前言 42 相關(guān)技術(shù)支持 5 Cocos2d-x框架層 5 渲染 5 動畫 5 事件分發(fā) 5 網(wǎng)絡(luò) 5 UI 5 Cocos2d-x設(shè)計模式[13] 5 單例模式 5 二段構(gòu)建模式 6 管理者模式 6 外觀模式[16] 6 防御式編程模式 7 觀察者模式 7 組合模式 7 中介者模式 73 游戲總體分析與設(shè)計 8 游戲規(guī)則 8 玩法介紹 8 雞類介紹 8 捕捉成功率 8 道具介紹 8 游戲關(guān)卡 8 關(guān)卡場景 8 關(guān)卡限定 8 關(guān)卡數(shù)組 8 游戲總體設(shè)計 8 游戲設(shè)計流程 9 游戲邏輯流程 94 游戲詳細(xì)設(shè)計和實現(xiàn) 13 菜單場景的實現(xiàn) 13 初始化的界面 14 按鈕回調(diào) 15 關(guān)卡選擇場景的實現(xiàn) 18 游戲場景的實現(xiàn) 22 World(地圖) 23 Number(生命值) 24 ChickenManager(小雞管理器) 24 Number(道具管理器) 30 場景的具體實現(xiàn) 315 總結(jié) 38致謝 39參考文獻(xiàn) 40基于Cocos2d-x游戲引擎的小雞對抗游戲開發(fā)摘要本文基于cocos2d_x游戲引擎,結(jié)合當(dāng)前生活中所遇到的H7N9而自制的一款休閑類游戲“小雞對抗”,該游戲?qū)崿F(xiàn)了玩家與感染有病毒的小雞做斗爭的過程,玩家需要通過一系列的道具去消滅患有H7N9的小雞,從而獲得勝利,該游戲提高了玩家對H7N9的重視,具有時代感,且具有一定的娛樂性和社會實用性。關(guān)鍵詞:游戲開發(fā);cocos2d_x引擎;cocos2d_x游戲開發(fā);小雞對抗游戲TheChickenConfrontationgamedevelopmentThatbasedOnthegameengineofCocos2d-xAbstractThethesisisbasedonthegameengineofCocos2d-x.CombinedwiththetroubleofH7N9,Imadetheleisuregame”TheChickenConfrontationgame”,Thegamerealizetheprocessthatplayersfightagainstthechickenwithvirus,IFplayerwantstowinheneeduseaseriesofpropstodestroythechickenwithH7N9,thegamehasthetimefeelingandhasEntertainmentandSocialutilitytoacertainextent.Keywords:mobilegamesdevelop;thegameengineofCocos2d-x;Cocos2d-xgamedevelop;TheChickenConfrontationGamePAGE湖北科技學(xué)院本科畢業(yè)設(shè)計(論文):基于Cocos2d-x的小雞對抗游戲開發(fā)PAGE湖北科技學(xué)院本科畢業(yè)論文:用winsock實現(xiàn)FTP客戶端PAGE0前言隨著科技的發(fā)展,成了人們生活中的必需品,每時每刻都可以看到的存在,除了日常的接打,發(fā)信息,娛樂也成了不可或缺的功能,相應(yīng)的,游戲具有開發(fā)團隊小,開發(fā)周期短,成本預(yù)算小以及低風(fēng)險高回報等優(yōu)點,于是游戲開發(fā)[1]近來也越來越火爆,吸引人們從事這一方面的開發(fā)。Cocos2d-x[2]是一個開源的、跨平臺的、輕量級的2d游戲引擎,它發(fā)展的重點是圍繞cocos2d跨平臺,即其實現(xiàn)一次編碼,再各平臺分別編譯后即可運行,不許為跨平臺修改大量代碼,不需要在一直方面花費很多時間和人力,目前cocos2d-x引擎已經(jīng)可以跨以下平臺:IOS[3]、Android[4]、Window、Linux[5]、BlackBerry、WindowPhone等平臺。其除跨平臺外,相對其它的移動游戲引擎還有以下特點:易用性,易于學(xué)習(xí)掌握的API,大量示例代碼和文檔;高效性,使用OpenGLES[6];靈活性,易于擴展,易于與其他開源庫集成使用;成功商用,根據(jù)開源社區(qū)的保守統(tǒng)計,基于Cocos2d-x開發(fā)的游戲全球范圍內(nèi)已經(jīng)突破一億安裝量等。因此開發(fā)游戲,cocos2d-x是一個很好的選擇。近期,由于H7N9[7]的盛行,引發(fā)了我想制作出與此有關(guān)的游戲,這樣不僅可以提高人們的警覺性與關(guān)注性,避免病菌肆意的傳播,還具有一定的娛樂性,使玩家在娛樂的過程中對H7N9的關(guān)注。在利用cocos2d-x引擎制作這款游戲的過程中,主要是進(jìn)行游戲場景中的制作,導(dǎo)演去控制整個游戲的運作,管理著游戲內(nèi)的場景,布景,和人物角色有序的運行,在此游戲中的場景有三個,分別為菜單場景、關(guān)卡場景和游戲場景,布景測相當(dāng)于每個場景下的背景,人物角色也就是這個游戲中的小雞。相關(guān)技術(shù)支持Cocos2d-x框架層整體來說,cocos2dX提供的一個簡便的框架,包含了渲染[8],動畫[9],事件分發(fā)[10],網(wǎng)絡(luò)[11]還有UI,物理引擎[12]等幾大模塊渲染Cocos2d-x的渲染數(shù)據(jù)跟精靈進(jìn)行了綁定,然后對于openGl也是直接進(jìn)行了調(diào)用,而不是采用策略或者插件進(jìn)行調(diào)用。對于后期如果采用DX的話,這塊比較冗余些。但是這些并不會影響游戲的渲染速度。它提供了batch來進(jìn)行批次渲染。所以在游戲里,我們對資源進(jìn)行了分組,然后分別用textPacker拼成一張圖片,然后統(tǒng)一采用批次渲染。游戲的速度會提升很多。

對于游戲數(shù)據(jù)的管理,cocos2d-x采用CCTextureCache這個單例類進(jìn)行管理。釋放可以采用全部釋放,還有釋放沒有用過的。并且也提供了異步加載動畫資源的方法,所以對于渲染這塊,我們盡量用批次,但是我們要記得釋放內(nèi)存。動畫Cocos2d-x提供了一套action機制。整體來說,是spriterunaction。然后驅(qū)動action里面的動畫數(shù)據(jù),進(jìn)行播放動畫。所有的動畫都可以走action接口。對于使用者來說,也不用去關(guān)心其他東西,只需要初始化好你想要的動作,把動作數(shù)據(jù)塞給action。讓spriterun就可以了。事件分發(fā)Cocos2d-x對于事件分發(fā)這塊就比較弱。他的事件管理是通過存儲每一個object以及他接收事件的優(yōu)先級。然后進(jìn)行分發(fā)。但是他并沒有對場景進(jìn)行樹的管理。所以我們就是建立起場景樹,然后事件分發(fā)先從場景頂端往下分發(fā)。期間每個節(jié)點可以設(shè)置是否響應(yīng)以及是否繼續(xù)往下傳遞的屬性,完全丟棄了cocos的那一套事件分發(fā)機制。對于場景樹的維護,只需要每次step的時候更新下。網(wǎng)絡(luò)Cocos2d-x提供了對curl的封裝。提供了的一些簡單比如get,post的封裝。但對于斷點續(xù)傳等并沒有封裝UICocos2d-x提供了幾種簡單的控件,比如說是CCMenu,CCLabelTTF,CCTableView,CCScrollView,CCImage還有textInput。Cocos2d-x設(shè)計模式[13]單例模式Cocos2D-x中的單例如下:CCDirector,CCTextureCache,CCSpriteFrameCache,CCAnimationCache,CUserDefault,CCNotificationCenter,CCShaderCache,CCScriptEngineManager,CCPoolManager,CCFileUtils,CCProfiler,SimleAudioEngie,CCConfiguration,CCApplication,CCDirectorCaller(ios平臺),CCEGLView。這里只介紹CCDirector與CCTextureCache單例。首先是CCDirector單例,它負(fù)責(zé)管理初始化OpenGL渲染窗口以及游戲場景的流程控制,它是cocos2dx游戲開發(fā)中必不可少的類之一。為什么要把此類設(shè)計成單例對象呢?因為,一個游戲只需要有一個游戲窗口就夠了,所以,只需要初始化一次OpenGL渲染窗口。而且場景的流程控制功能,也只需要存在一個這樣的場景控制對象即可。為了保證CCDirector類只存在一個實例對象,就必須使用單例模式。接下來是CCTextureCache單例。此類主要負(fù)責(zé)加載游戲當(dāng)中所需要的紋理圖片資源,這些資源加載好以后,就可以一直保留在內(nèi)存里面,當(dāng)下次再需要使用此紋理的時候,直接返回相應(yīng)的紋理對象引用就可以了,無需再重復(fù)加載。當(dāng)然,這樣做可能會很浪費內(nèi)存,所以cocos2dx采用了一種引用計數(shù)的方式來管理對象內(nèi)存,當(dāng)紋理剛被加載進(jìn)來的時候,引用計數(shù)為1。如果使用此紋理對象創(chuàng)建一個精靈,那么此紋理對象引用會加1.如果精靈被釋放,則相應(yīng)的引用計數(shù)減1.當(dāng)紋理的引用計數(shù)變?yōu)?的時候,紋理所占用的內(nèi)存自然就會被釋放掉。這也是為什么在收到內(nèi)存警告的時候,會調(diào)用CCTextureCache的removeUnusedTextures方法。此方法會將所有引用計數(shù)為1的紋理對象全部釋放掉。單從字面上看,Cache,即緩存的意思。它以犧牲一定的內(nèi)存壓力為代價,帶來的是游戲性能的提升。這種cache技術(shù),在游戲開發(fā)中比比皆是。注:IO操作對游戲性能影響非常大,要極力避免。二段構(gòu)建模式構(gòu)建模式指的是:將一個對象的構(gòu)建分為兩個步驟來進(jìn)行:分配內(nèi)存和初始化。在游戲開發(fā)中使用此模式的方法為:在使用cocos2d-x的時候,如果你繼承CCSprite實現(xiàn)自定義的精靈,你也需要按照“二段構(gòu)建”的方式,為你的類提供一個靜態(tài)工廠方法,同時編寫相應(yīng)的初始化方法。當(dāng)然,命名規(guī)范最好和cocos2d-x統(tǒng)一,即靜態(tài)工廠方法[14]為create,而初始化方法為initXXXX。管理者模式管理者模式指的是:管理者類(cache類)可以簡化一些可以重用的資源(比如字體、紋理[15]、精靈幀等)的創(chuàng)建和管理工作。管理者模式其實是個混合模式,它綜合了單例模式、外觀模式和工廠模式。該模式在游戲開發(fā)中比較常見,很多需要提升游戲運行性能的場合都運用了此模式。此模式提供一個統(tǒng)一的接口來管理一組相關(guān)對象的實例化和訪問。在cocos2dx游戲開發(fā)中,經(jīng)常需要使用CCAnimate動作來播放動畫,這些動作的創(chuàng)建運行時開銷是比較大的,一般采用的方式都是在node的init方法中創(chuàng)建好,然后retain。之后需要使用的時候直接引用此動作即可,前提是你得聲明許多CCAnimate對象的弱引用。這里,我們可以為之創(chuàng)建一個CCAnimateCache類,專門用來管理這些動畫動作實例。這樣對于游戲中經(jīng)常變換狀態(tài)需要更換不同的動畫時,可以從此CCAniamteCache類中獲取相應(yīng)動畫引用,非常方便,同時可以提高游戲性能。相應(yīng)的,也可以為Action創(chuàng)建相應(yīng)的類。但凡那些對象,在運行時創(chuàng)建的時間開銷特別大時,而又要經(jīng)常重復(fù)使用時,都可以采取此模式來提高運行時性能。外觀模式[16]外觀模式指的是:為子系統(tǒng)中的一組接口提供一個一致的界面,它定義了一個高層接口,這個接口使得子系統(tǒng)更加容易使用。它很好地體現(xiàn)了“最少知識原則”。它的本質(zhì)是:封裝交互、簡化調(diào)用。游戲開發(fā)過程中,暫時還沒發(fā)現(xiàn)此模式的明顯用法。不過,模式不是說學(xué)習(xí)了一定要馬上就用到,那樣會導(dǎo)致過度設(shè)計。如果讀者開發(fā)游戲過程中,積累出一套比較成熟的框架,而這個框架又可以劃分多個子系統(tǒng),比如碰撞子系統(tǒng)、網(wǎng)絡(luò)子系統(tǒng)、數(shù)據(jù)持久化子系統(tǒng)等。當(dāng)外部使用此子系統(tǒng)時,操作的類過多,理解起來特別復(fù)雜時,這時候就可以考慮引入一個Fa?ade類,來簡化客戶程序與子系統(tǒng)之間的調(diào)用關(guān)系。防御式編程模式防御式編程模式指的是:子程序應(yīng)該不因傳入錯誤數(shù)據(jù)而被破壞,哪怕是由其他子程序產(chǎn)生的錯誤數(shù)據(jù)。防御式編程是提高程序代碼質(zhì)量的一種手段,實際上它不能算是真正意義上的模式。我們一般可以采用以下手段來進(jìn)行防御式編程:1)檢查每個子程序的入口參數(shù),記住“垃圾進(jìn)、垃圾出”這個隱喻。必要的時候可以使用斷言來確保函數(shù)的先驗條件是符合假定的。因為很多時候,我們編寫代碼都是隱藏了一系列的假定的,只是你自己沒有感覺到,有時候,這些假定沒有關(guān)系,出了bug也容易找出來。但是,有時候,就不是那么幸運了。2)不要直接使用文字常量,比如“Hero.png”這種常量。盡可能地定義const定義常量或者使用宏定義。3)盡可能讓函數(shù)返回一些東西,這樣如果當(dāng)函數(shù)運行出現(xiàn)問題時,可以根據(jù)返回值做一些處理。如果全部設(shè)計成void類型的函數(shù),那么出現(xiàn)異常要么就是try—catch,要么就是直接讓程序崩潰了。由于c++的異常機制[17]并不是那么完善,所以,也一直為人們所詬病,cocos2d-x里面幾乎沒有使用c++的異常處理機制。最后,必要的時候要檢查函數(shù)里面調(diào)用其它子程序時的返回值。觀察者模式觀察者模式指的是:對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。在cocos2dx游戲開發(fā)中,我們考慮cocos2d-x中一個非常典型的應(yīng)用場景,你的GameScene里面有兩個layer,一個gameLayer,它包含了游戲中的對象,比如玩家、敵人等。另一個層是HudLayer,它包含了游戲中顯示分?jǐn)?shù)、生命值等信息。如何讓這兩個層相互通信。觀察者模式是實現(xiàn)MVC模式[18]的重要組成部分,一個model可以對應(yīng)多個views,model就是目標(biāo)對象,而view則是觀察者,當(dāng)model改變的時候,要通知所有的view也相應(yīng)的改變。組合模式組合模式指的是:將對象組合成樹形結(jié)構(gòu)以表示“部分整體”的層次結(jié)構(gòu)。組合模式使得用戶對單個對象和使用具有一致性。因為游戲開發(fā)不是設(shè)計框架,基本上使用組合模式的情形不多。但是,如果有遞歸[19]或者樹形結(jié)構(gòu)[20]的對象關(guān)系,都可以考慮使用組合模式。中介者模式中介者模式指的是:用一個中介對象來封裝一系列的對象交互。中介者使得各對象不需要顯式地相互引用,從而使其松散耦合,而且可以獨立地改變它們之間的交互。游戲世界里的對象關(guān)系非常復(fù)雜,如果設(shè)計得不好,極容易形成強耦合。而游戲天生又是需要經(jīng)常更新、修改bug和升級的,這就導(dǎo)致了游戲程序的維護和擴展非常地難。使用中介者模式可以減少游戲世界里面對象之間的多對多關(guān)系,使之轉(zhuǎn)變成多對一的關(guān)系。關(guān)于中介者的實現(xiàn),可以把AppDelegate類設(shè)計成中介者對象,也可以自定義中介者對象,比如GameManager類。把此類設(shè)計成單例類,可以方便訪問,同時,此類可以擁有像gameScene,levelSaver等類的引用,方便其它對象與這些對象進(jìn)行交互。中介者模式的實現(xiàn)可以采用單例模式,同時,在處理同事對象之間的交互的時候,可以采用觀察者模式。游戲總體分析與設(shè)計游戲規(guī)則玩法介紹玩家可以通過移動鼠標(biāo),拖拽道具到地圖上,將道具放在相應(yīng)的位置上,根據(jù)不同的道具有不同的功效,玩家采用不同的道具去捕捉病雞,但消滅完所有的病雞,游戲過關(guān),當(dāng)病雞的數(shù)量到達(dá)了15只,或是總雞數(shù)達(dá)到了20只,闖關(guān)失敗。雞類介紹總共有四種顏色的小雞,分別為紅色,黃色,藍(lán)色,紫色,其中紅色和黃色的小雞為健康的,藍(lán)色和紫色的小雞為感染H7N9病毒的,而紅色和紫色的小雞為母雞,黃色和藍(lán)色的小雞為公雞。于此同時,還有一些母雞剛下下來的雞蛋(白色),以及剛孵化出來的小雞。捕捉成功率這是根據(jù)道具的功能以及拖拽道具到一定位置上病雞的數(shù)量來決定的。道具介紹玩的過程中用戶可以使用道具去捕捉小雞,總共有三種道具,分別是炸彈,骷髏頭和藥水,炸彈的威力最大,一個炸彈可以涉及到的位置是地圖上的9格,也就是以炸彈為中心的九宮格,它可以消滅到這格區(qū)域內(nèi)所有的小雞,骷髏頭是可以消滅它所在地方的一只小雞,而藥水則是可以使得感染上病毒的小雞恢復(fù)健康。游戲關(guān)卡關(guān)卡場景一共有4個關(guān)卡場景,分別是:綠色平原、楓葉樹林、寒冬之嶺和黃金之路,關(guān)卡的難度依次上升,主要體現(xiàn)在病雞的數(shù)量上,病雞的數(shù)量愈多,難度越大。關(guān)卡限定首次進(jìn)入游戲時,只有綠色平原這個關(guān)卡場景是可以進(jìn)入的,其他的均不可進(jìn)入,只有完成了上一關(guān)卡,下一關(guān)卡才可以進(jìn)入,也就是開始我們只是可以看到游戲中總共有的場景,而每個場景的布局是未知的。關(guān)卡數(shù)組每個關(guān)卡場景中,由于是有障礙物的,小雞們是不可以穿過障礙物,因此為每個關(guān)卡場景都定義了一個數(shù)組,此數(shù)組用來記錄每個關(guān)卡中是否有障礙物,每個關(guān)卡的地圖都是由12*16個小格子組成,每個小格子由數(shù)組中的相應(yīng)的元素構(gòu)成,元素的值為1或是0,1則表示此小格上有障礙物,小雞們不能在此處行走,只能繞道而行,0代表此處為空閑地帶,小雞們可以自由的行走。游戲總體設(shè)計根據(jù)進(jìn)行的游戲規(guī)則和游戲關(guān)卡分析,我們根據(jù)分析結(jié)果開始進(jìn)行總體設(shè)計。在設(shè)計過程中,我們遵循了軟件工程的原理和方法;先采用抽象機制將系統(tǒng)模塊化,同時運用面向?qū)ο蟮乃枷?,將模塊細(xì)化,依此進(jìn)行開發(fā)工作。系統(tǒng)的設(shè)計實現(xiàn)及其運作模式都體現(xiàn)了這些原理和方法的應(yīng)用。游戲設(shè)計流程游戲用場景樹的形式表現(xiàn)出來,包括有菜單場景、關(guān)卡選擇場景和游戲場景,這三個場景由導(dǎo)演管理。菜單場景包括有背景精靈、進(jìn)入關(guān)卡菜單項、游戲介紹菜單項、結(jié)束游戲菜單項;關(guān)卡選擇場景包括返回菜單項和滾動圖層,兒滾動圖層有由背景精靈、揮動序列精靈和進(jìn)入游戲選項卡構(gòu)成;游戲場景則有背景精靈、小雞精靈、返回菜單項、重新開始菜單項構(gòu)成。其結(jié)構(gòu)如圖3.1所示:圖3.1游戲設(shè)計流程圖游戲邏輯流程游戲開始后進(jìn)入到菜單場景,在菜單場景中玩家可以選擇結(jié)束游戲、游戲介紹、或是進(jìn)入到游戲關(guān)卡選擇中,進(jìn)入到關(guān)卡選擇場景后,玩可以根據(jù)自己的需要進(jìn)行關(guān)卡的選擇,不夠這個選擇也是有條件的,等級選擇完成后,玩家進(jìn)入到相應(yīng)的游戲場景中,進(jìn)入到游戲場景后,四種小雞在允許移動的地方運動,但公雞與母雞走到同一位置,便有一個雞蛋生成,玩家需要通過移動右邊的道具到地圖上去消滅染有病毒的雞。其流程如圖3.2所示:菜單場景中主要是menu的選擇。游戲開始選擇點擊按鈕當(dāng)選擇游戲介紹按鈕時,進(jìn)入到游戲介紹的頁面當(dāng)選擇退出游戲按鈕時,為了防止是玩家不小心的動作,從而中間又加入了一個判斷,若是選擇退出游戲,則結(jié)束游戲,若否,則有回到最初的頁面當(dāng)選擇進(jìn)入游戲關(guān)卡按鈕時,直接進(jìn)入到游戲選擇關(guān)卡場景其流程圖如圖3.3所示:圖3.2游戲邏輯流程圖圖3.3Menu選擇流程圖關(guān)卡選擇流程如下:1、進(jìn)入關(guān)卡選擇場景2、進(jìn)行關(guān)卡的選擇3、若點擊綠色平原,則進(jìn)入到綠色平原游戲場景中,否則可以向右滑動屏幕到楓葉樹林關(guān)卡4、若玩家之前已通過了綠色平原關(guān)卡且點擊了楓葉樹林關(guān)卡,則進(jìn)入到楓葉樹林游戲場景中5、若沒有點擊楓葉樹林關(guān)卡,則可以向左滑動屏幕到綠色平原關(guān)卡,或者向右滑動屏幕到寒冬之嶺關(guān)卡6、若玩家之前已通過了楓葉樹林關(guān)卡且點擊了寒冬之嶺關(guān)卡,則進(jìn)入到寒冬之嶺游戲場景中7、若沒有點擊寒冬之嶺關(guān)卡,則可以向左滑動屏幕到楓葉樹林關(guān)卡,或者向右滑動屏幕到黃金之路關(guān)卡8、若玩家之前已通過了寒冬之嶺關(guān)卡且點擊了黃金之路關(guān)卡,則進(jìn)入到黃金之路游戲場景中9、若沒有點擊黃金之路關(guān)卡,則可以向左滑動屏幕到寒冬之嶺關(guān)卡其流程圖如圖3.4所示:游戲場景中主要是用定時器來控制小雞、雞蛋、道具的產(chǎn)生以及消息和道具的移動。1、新關(guān)卡開始2、根據(jù)不同的關(guān)卡在不同的位置產(chǎn)生不同數(shù)量的小雞3、產(chǎn)生道具4、每隔一定的時間改變小雞的位置(小雞不允許在障礙物上行走)5、移動道具時,實時的控制道具的移動位置6、每隔一定的時間同種已用的道具再次出現(xiàn)其流程圖如圖3.5所示:玩家捕雞流程如下:1、玩家在相應(yīng)的道具上點擊,拖動道具到地圖上2、若道具是火,則在以拖動到的位置為中心的九宮格的地方進(jìn)行爆破,爆破的地方所有的小雞和激動都會死亡,小雞死亡的同時,此道具也會消失3、若道具是骷髏頭,則在道具拖動的位置上的小雞或是小雞移動到此處的小雞將會死亡,小雞死亡的同時,此道具也會消失4、若道具是藥劑,則在道具拖動的位置上的感染上病毒的小雞將會痊愈5、當(dāng)總共小雞和雞蛋的數(shù)量達(dá)到了20只或是感染上病菌的小雞和雞蛋的數(shù)量達(dá)到了15只,游戲?qū)Y(jié)束,顯示為闖關(guān)失敗6、當(dāng)?shù)貓D上的小雞和雞蛋全為健康的時候,游戲結(jié)束,顯示為過關(guān),同時下一關(guān)卡將被開啟其流程圖如圖3.6所示:圖3.4關(guān)卡選擇流程圖圖3.5定時器控制小雞及道具圖圖3.6玩家捕雞流程圖游戲詳細(xì)設(shè)計和實現(xiàn)菜單場景的實現(xiàn)菜單場景的主要作用是供玩家的選擇,菜單場景中提供了游戲介紹、退出游戲、進(jìn)入游戲關(guān)卡三個菜單項。結(jié)構(gòu)圖如圖4.1所示:圖4.1菜單場景結(jié)構(gòu)圖場景中采用的是單例模式,直接由一個靜態(tài)的函數(shù)去創(chuàng)建一個場景,再將自己所定義的層加入到場景的孩子節(jié)點中,這里所用到的是cocos2d-x節(jié)點管理,cocos2d-x使用節(jié)點組成一棵樹,渲染的時候要遍歷這棵樹。實現(xiàn)代碼如下:CCScene*scene=CCScene::create();GameStart*layer=newGameStart(); layer->init(); scene->addChild(layer); layer->release(); returnscene;初始化的界面1、背景精靈的創(chuàng)建,所使用的是一張名為的圖片區(qū)創(chuàng)建的,實現(xiàn)代碼如下:CCSprite*b_Sprite=CCSprite::create("StartBackground.jpg"); b_Sprite->setPosition(ccp(WIDTH/2,HEIGHT/2)); this->addChild(b_Sprite,0); 2、三個菜單項的創(chuàng)建,實現(xiàn)代碼如下:CCMenuItemImage*pCloseItem=CCMenuItemImage::create( "back.png","back2.png",this,menu_selector(GameStart::menuCloseCallback)); pCloseItem->setPosition(ccp(WIDTH-50,50)); CCMenuItemImage*sItem=CCMenuItemImage::create( "Start.png","Start.png",this,menu_selector(GameStart::get_start)); sItem->setPosition(ccp(WIDTH/2,HEIGHT-40)); CCMenuItemImage*rItem=CCMenuItemImage::create( "help.png","help.png",this,menu_selector(GameStart::get_instruction)); rItem->setPosition(ccp(50,50));3、創(chuàng)建菜單,將上述的三個菜單項加入其中,進(jìn)行統(tǒng)一的管理,實現(xiàn)代碼如下: CCMenu*rMenu=CCMenu::create(rItem,NULL); rMenu->setPosition(CCPointZero); this->addChildpCloseItem(pCloseItem,sItem,rMenu,1); …菜單場景的效果圖如圖4.2所示:圖4.2菜單場景效果圖按鈕回調(diào)1、游戲介紹的回調(diào)函數(shù),首先將此層中所有的孩子節(jié)點刪除掉,再重新構(gòu)造此層的孩子節(jié)點,主要包括了一個背景精靈一個一個返回上一層的按鈕雞菜單,實現(xiàn)代碼如下: removeAllChildren(); CCSprite*b_Sprite=CCSprite::create("InstructionBackground.png"); b_Sprite->setPosition(ccp(WIDTH/2,HEIGHT/2)); this->addChild(b_Sprite,0); CCMenuItemImage*rItem=CCMenuItemImage::create( "back2.png","back1.png",this,menu_selector(GameStart::get_restart)); rItem->setPosition(ccp(WIDTH-50,50)); CCMenu*rMenu=CCMenu::create(rItem,NULL); rMenu->setPosition(CCPointZero); this->addChild(rMenu,1); 此返回按鈕的回調(diào)函數(shù)的實現(xiàn)體就是將剛創(chuàng)建的孩子節(jié)點全部清除,再重新的初始化界面 this->removeAllChildren(); init();游戲介紹的效果圖如圖4.3所示:圖4.3游戲介紹效果圖2、退出游戲的回調(diào)函數(shù),首先將初始化退出游戲的界面,實現(xiàn)代碼如下: 背景精靈的創(chuàng)建: b_Sprite=CCSprite::create("opsity.png"); b_Sprite->setPosition(ccp(WIDTH/2,HEIGHT/2)); b_Sprite->setOpacity(150); this->addChild(b_Sprite); b_SpriteBg1=CCSprite::create("exitbg1.png"); b_SpriteBg1->setPosition(ccp(WIDTH/2,HEIGHT/2)); b_SpriteBg1->setOpacity(100); this->addChild(b_SpriteBg1); b_SpriteBg2=CCSprite::create("exitbg2.png"); b_SpriteBg2->setPosition(ccp(WIDTH/2,HEIGHT/2)); this->addChild(b_SpriteBg2); b_SpriteBg3=CCSprite::create("exitbg3.png"); b_SpriteBg3->setPosition(ccp(WIDTH/2,HEIGHT/2)); this->addChild(b_SpriteBg3); 確定退出游戲菜單項的創(chuàng)建: CCMenuItemImage*pYesItem=CCMenuItemImage::create( "Yes.png","Yes.png",this,menu_selector(GameStart::menuYesCallback)); pYesItem->setPosition(ccp(WIDTH/2-100,HEIGHT/2-100)); 取消退出游戲菜單項的創(chuàng)建: CCMenuItemImage*pNoItem=CCMenuItemImage::create( "No.png","No.png",this,menu_selector(GameStart::menuNoCallback)); pNoItem->setPosition(ccp(WIDTH/2+100,HEIGHT/2-100)); pMenu=CCMenu::create(pYesItem,pNoItem,NULL); pMenu->setPosition(CCPointZero); this->addChild(pMenu); 而最終的退出游戲的實現(xiàn)代碼則是: CCDirector::sharedDirector()->end();退出游戲的效果圖如圖4.4所示:圖4.4退出游戲效果圖3、關(guān)卡選擇按鈕的實現(xiàn)則是進(jìn)行場景的切換,使得有菜單場景切換到關(guān)卡選擇場景,實現(xiàn)代碼如下: CCDirector::sharedDirector()->setDepthTest(true); CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameChoose::scene()));關(guān)卡選擇場景的實現(xiàn)在關(guān)卡場景中主要是關(guān)卡的選擇,關(guān)卡包括有:綠色平原、楓葉樹林、寒冬之嶺、黃金之路,闖關(guān)的等級是用xml文件來記錄的,每次進(jìn)入到關(guān)卡選擇場景時都需要讀取xml文件中的內(nèi)容,因為根據(jù)闖關(guān)的等級的不同,能進(jìn)入到的游戲場景也是不同的,只有當(dāng)上一等級通過了,下一等級的關(guān)卡才會被打開。當(dāng)玩家滑動屏幕時,將會瀏覽到不同的關(guān)卡菜單,點擊不同的菜單精靈,處理不同的事件。由于本場景中用到了滑動列表,因此,需創(chuàng)建一個CCScrollView的對象,4個關(guān)卡精靈,4個點精靈,一個返回按鈕等。實現(xiàn)代碼如下:將此層設(shè)置為可觸屏的層,通過重寫底層的4個虛函數(shù)實現(xiàn)。virtualvoidregisterWithTouchDispatcher();virtualboolccTouchBegan(CCTouch*touch,CCEvent*event);virtualvoidccTouchMoved(CCTouch*touch,CCEvent*event);virtualvoidccTouchEnded(CCTouch*touch,CCEvent*event);將此層設(shè)置為滑動列表的層,通過重寫底層的2個虛函數(shù)實現(xiàn)。voidscrollViewDidScroll(CCScrollView*view);voidscrollViewDidZoom(CCScrollView*view);初始化此層時,需要進(jìn)行讀取檔案(m_curGameLevel變量指的是所闖關(guān)的等級,初始值為1)。CCUserDefault*pUserDefault=CCUserDefault::sharedUserDefault();m_curGameLevel=pUserDefault->getIntegerForKey("curGameLevel",m_curGameLevel);添加一個CCScroView(其中創(chuàng)建了一個CCLayer層,用來存放CCScroView的容器;4個關(guān)卡菜單精靈;設(shè)置了CCScroView的顯示域的范圍,范圍為800*480,總的大小800*4*480*4,既有4個這樣的大?。〤CLayer*pLayer=CCLayer::create();charhelpstr[30]={0};有四個關(guān)卡,因此有四個循環(huán)體,主要是用來創(chuàng)建關(guān)卡場景的背景的 for(inti=1;i<=4;++i) {CCSprite*m_pBGSprite=CCSprite::create("bg1.png"); m_pBGSprite->setPosition(ccp(visibleSize.width*(i-0.5f),visibleSize.height/2)); pLayer->addChild(m_pBGSprite); sprintf(helpstr,"screenBg%d.png",i); CCSprite*pSpritebg=CCSprite::create(helpstr); pSpritebg->setPosition(ccp(visibleSize.width*(i-0.5f),90)); pLayer->addChild(pSpritebg); sprintf(helpstr,"level%d.png",i); CCSprite*pSprite=CCSprite::create(helpstr); pSprite->setPosition(ccp(visibleSize.width*(i-0.5f),visibleSize.height/2)); pLayer->addChild(pSprite);根據(jù)玩家所闖的等級數(shù)來確定關(guān)卡上是否加鎖,加了鎖的關(guān)卡表示玩家無法進(jìn)入到此關(guān)卡所對應(yīng)的游戲場景中 if(m_curGameLevel<i) { CCSprite*pSprite=CCSprite::create("suo.png"); pSprite->setPosition(ccp(visibleSize.width*(i-0.5f),visibleSize.height/2)); pSprite->setOpacity(200); pLayer->addChild(pSprite); } } m_pScrollView=CCScrollView::create(CCSizeMake(800,480),pLayer); m_pScrollView->setTouchEnabled(false); m_pScrollView->setDelegate(this); m_pScrollView->setDirection(kCCScrollViewDirectionHorizontal); pLayer->setContentSize(CCSizeMake(800*4,480)); this->addChild(m_pScrollView);}四個點精靈的創(chuàng)建,為了節(jié)省加載資源的時間,組成游戲的圖片不是單獨的,而是將幾張圖片合成一張大的圖片加載進(jìn)來,當(dāng)需要用到那些單獨的圖片時,用plist文件將其中的小圖片分割出來或者直接利用CCRectMake對圖片進(jìn)行切割。創(chuàng)建一個緩存精靈的實例,用來緩存后面的圖片CCSpriteFrameCache*pCache=CCSpriteFrameCache::sharedSpriteFrameCache();緩存四個點精靈pCache->addSpriteFrame(CCSpriteFrame::create("dotnumber.png",CCRectMake(0,0,21,21)),"button_normal.png");pCache->addSpriteFrame(CCSpriteFrame::create("dotnumber.png",CCRectMake(21,0,21,21)),"button_selected1.png");pCache->addSpriteFrame(CCSpriteFrame::create("dotnumber.png",CCRectMake(21*2,0,21,21)),"button_selected2.png");pCache->addSpriteFrame(CCSpriteFrame::create("dotnumber.png",CCRectMake(21*3,0,21,21)),"button_selected3.png");pCache->addSpriteFrame(CCSpriteFrame::create("dotnumber.png",CCRectMake(21*4,0,21,21)),"button_selected4.png"); 四個點精靈的創(chuàng)建 for(inti=1;i<=4;++i) { CCSprite*pPoint=CCSprite::createWithSpriteFrameName("button_normal.png"); pPoint->setTag(i);pPoint->setPosition(ccp(origin.x+(visibleSize.width-4*pPoint->getContentSize().width)/2+pPoint->getContentSize().width*(i-1),origin.y+30)); this->addChild(pPoint); }CCSprite*pPoint=(CCSprite*)this->getChildByTag(1); pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected1.png"));根據(jù)玩家滑動的距離來確定執(zhí)行的程序當(dāng)滑動的距離大于10時,也就是滑動頁面的時候pPoint->setDisplayFrame(pCache->spriteFrameByName("button_normal.png")); if(offset<0) m_nCurPage++; else m_nCur;當(dāng)當(dāng)前頁數(shù)小于1和大于4的時候應(yīng)該做相應(yīng)的處理,因為當(dāng)前的頁數(shù)的值只能在1到4這個范圍內(nèi) if(m_nCurPage<1) m_nCurPage=1; if(m_nCurPage>4) m_nCurPage=4; else { 根據(jù)當(dāng)前的頁數(shù)去確定不同的點精靈 pPoint=(CCSprite*)this->getChildByTag(m_nCurPage); if(m_nCurPage==1) pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected1.png")); elseif(m_nCurPage==2) pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected2.png")); elseif(m_nCurPage==3) pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected3.png")); elseif(m_nCurPage==4) pPoint->setDisplayFrame(pCache->spriteFrameByName("button_selected4.png")); 實現(xiàn)頁面滑動時候的效果 CCPointadjustPos=ccp(origin.x-visibleSize.width*(m_nCur1),0); m_pScrollView->setContentOffset(adjustPos,true); }當(dāng)滑動的距離小于10時,也就是點擊當(dāng)前以頁面的時候,當(dāng)當(dāng)前頁面小于或是等于所闖關(guān)的等級的時候,進(jìn)行場景的切換,或者不進(jìn)行處理if(m_nCurPage==1&&m_curGameLevel>=m_nCurPage) { CCDirector::sharedDirector()->setDepthTest(true); CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameScene::scene(1))); } elseif(m_nCurPage==2&&m_curGameLevel>=m_nCurPage) { CCDirector::sharedDirector()->setDepthTest(true); CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameScene::scene(2))); } elseif(m_nCurPage==3&&m_curGameLevel>=m_nCurPage) { CCDirector::sharedDirector()->setDepthTest(true); CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameScene::scene(3))); } elseif(m_nCurPage==4&&m_curGameLevel>=m_nCurPage) { CCDirector::sharedDirector()->setDepthTest(true); CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameScene::scene(4))); }當(dāng)點擊返回按鈕時,進(jìn)行場景的切換,又返回到菜單場景中CCDirector::sharedDirector()->setDepthTest(true);CCDirector::sharedDirector()->replaceScene(CCTransitionProgressInOut::create(0.5,GameStart::scene()));當(dāng)此場景的生命周期介紹前,完成內(nèi)存的回收以及進(jìn)行存檔CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);CCLayer::onExit();CCSpriteFrameCache::sharedSpriteFrameCache()->removeUnusedSpriteFrames();CCUserDefault*pUserDefault=CCUserDefault::sharedUserDefault();pUserDefault->setIntegerForKey("curGameLevel",m_curGameLevel);關(guān)卡選擇場景的效果圖如圖4.5所示:圖4.5選擇關(guān)卡場景效果圖游戲場景的實現(xiàn)游戲場景是游戲中主要的模塊。在這個場景中,為了更好的去管理場景下的一些元素,自定義了些類,包括了World(地圖)、Number(生命值)、ChickenManager(小雞管理器)、PropManager(道具管理器)結(jié)構(gòu)圖如圖4.6所示:圖4.6游戲場景結(jié)構(gòu)圖World(地圖)地圖也就是小雞行走的位置,地圖上有障礙物和空地,障礙物和空地的值是由1和0來表示的,游戲中有四個關(guān)卡,對應(yīng)4個地圖,每張地圖都對應(yīng)著一個16*12的二維數(shù)組,數(shù)組記錄的是地圖的行走的信息。聲明數(shù)組:staticintrocks[WIDTHNUM][HEIGHTNUM];地圖轉(zhuǎn)化為數(shù)組的實現(xiàn)代碼:if(num==2) { inta[12][16]= { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,1,0,1,0,1,0,1,0,0,0,1,0, 0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0, 0,1,0,1,1,1,1,1,1,1,1,1,1,0,1,1, 0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,0, 0,1,0,0,0,1,0,1,1,0,0,0,0,0,1,0, 0,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0, 0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,0, 1,1,0,1,1,1,1,1,1,1,1,1,1,0,1,0, 0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0, 0,1,0,0,0,1,0,1,0,1,0,1,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; for(inti=0;i<16;i++) for(intj=0;j<12;j++) rocks[i][j]=a[11-j][i]; }Number(生命值)生命值記錄的是游戲過程中雞的數(shù)量的改變,生命值由兩個值組成,一個是病雞的數(shù)量,一個是健康雞的數(shù)量,下面的是病雞的血條,上面的則是建康雞的血條,當(dāng)病雞的血條滿時或是病雞的血條加上健康雞的血條占滿了生命值的整個空間是,游戲結(jié)束,闖關(guān)失敗,當(dāng)病雞的血條為0時,游戲結(jié)束,闖關(guān)成功。實現(xiàn)代碼如下:if(ill_num>15||ill_num+health_num>20) returnfalse; inti; for(i=0;i<ill_num;i++) { CCSprite*m_sprite=CCSprite::create("ill_num.png"); m_sprite->setPosition(ccp(NUMLOC,79+20*i)); addChild(m_sprite); } for(;i<ill_num+health_num;i++) { CCSprite*m_sprite=CCSprite::create("health_num.png"); m_sprite->setPosition(ccp(NUMLOC,79+20*i)); addChild(m_sprite); }returntrue;ChickenManager(小雞管理器)小雞管理器中管理著病雞、建康雞、病蛋、健康蛋。結(jié)構(gòu)圖如圖4.7所示:圖4.7小雞管理器結(jié)構(gòu)圖容器的聲明:vector<IllChicken*> ills; vector<HealthChicken*> healths; vector<Egg*> eggs; vector<HealthEgg*> health_eggs; vector<IllEgg*> ill_eggs; vector<CCPoint*> temp_loc; vector<int> temp_type; vector<CCSprite*> fires;小雞的產(chǎn)生,其中的變量type為小雞的類型,0代表的是感染上病毒的小雞,1代表的是健康的小雞。inits函數(shù)的參數(shù)的含義依次為:產(chǎn)生雞的位置、方向、性別。實現(xiàn)代碼如下:if(type==0) { IllChicken*i=newIllChicken(); i->inits(a,d,s); ills.push_back(i); addChild(i,3); } elseif(type==1) { HealthChicken*h=newHealthChicken(); h->inits(a,d,s); healths.push_back(h); addChild(h,3); }小雞的創(chuàng)建,sex指的是性別,0代表的是公雞,1代表的是母雞,dir指的是方向,0代表的是向上,1代表的是向左,2代表的是向下,3代表的是向右。這里是根據(jù)不同的性別不同的方向由不同的圖片在不同的位置上創(chuàng)建小雞精靈。實現(xiàn)代碼如下:if(sex==0) { if(dir==0) p_sprite=CCSprite::create("illmaleup.png"); elseif(dir==1) p_sprite=CCSprite::create("illmaleleft.png"); elseif(dir==2) p_sprite=CCSprite::create("illmaledown.png"); elseif(dir==3) p_sprite=CCSprite::create("illmaleright.png"); } elseif(sex==1) { if(dir==0) p_sprite=CCSprite::create("illfemaleup.png"); elseif(dir==1) p_sprite=CCSprite::create("illfemaleleft.png"); elseif(dir==2) p_sprite=CCSprite::create("illfemaledown.png"); elseif(dir==3) p_sprite=CCSprite::create("illfemaleright.png"); } p_sprite->setPosition(ccp((loc->x+0.5)*BOXSIDE,(loc->y+0.5)*BOXSIDE)); addChild(p_sprite,3);雞蛋的產(chǎn)生,其中的變量temp_loc為一個CCPoint類型的容器,inits為蛋的創(chuàng)建函數(shù),主要是蛋精靈的創(chuàng)建,以及添加到父節(jié)點中,第一個參數(shù)為雞蛋所在的位置,第二個為雞蛋的類型,0代表的是由病菌的蛋,1是健康的蛋。實現(xiàn)代碼如下:for(inti=0;i<temp_loc.size();i++) { Egg*egg=newEgg(); egg->inits(temp_loc[i],temp_type[i]); eggs.push_back(egg); addChild(egg,1); } temp_type.clear(); temp_loc.clear();當(dāng)兩只小雞走到同一位置時,總共有四種情況,分別是:病雞與病雞相撞、病雞與健康雞相撞、健康雞與病雞相撞、健康雞與健康雞相撞,這里只列出了一種情況,病雞與病雞相撞,其他的情況類似,只是產(chǎn)生的雞蛋的類型不一樣,病雞與病雞相撞孵化出來的是病雞,健康雞與健康雞相撞孵化出來的是健康雞,而其他兩種則是隨機的,可能是病雞也可能是健康的雞,而孵化出來的雞的性別是隨機的,代表的是小雞停留的時間,母雞停留的時間會是公雞停留的時間的3倍。代碼的實現(xiàn)如下:for(intk=0;k<ills.size();k++){if(k!=i&&ills[i]->sex!=ills[k]->sex&&ills[i]->loc->x==ills[k]->loc->x&&ills[i]->loc->y==ills[k]->loc->y) { if(ills[i]->sex==1) { ills[i]->delay=3; ills[k]->delay=1; } else { ills[i]->delay=1; ills[k]->delay=3; } creat_egg(ills[i]->loc,0); }}當(dāng)小雞與道具相撞時,根據(jù)小雞的類型與道具的類型,會有不同的動作。這里只舉了病雞與道具骷髏頭和道具藥劑相撞的例子,type為0指的是道具為藥劑,type為1指的是道具為骷髏頭,其中g(shù)et_healthy函數(shù)是將病雞治愈為健康的雞,這些主要是對容器的操作,后面再根據(jù)容器的大小,值進(jìn)行不同的顯示。實現(xiàn)代碼如下:for(intj=0;j<ills.size();j++){ for(inti=0;i<sp.size();i++) if(sp[i]->loc->x==ills[j]->loc->x&&sp[i]->loc->y==ills[j]->loc->y) { if(sp[i]->type==0) { get_healthy(j); sp[i]->remove_sprite(); sp.erase(sp.begin()+i); break; } elseif(sp[i]->type==1) { this->removeChild(ills[j]); ills.erase(ills.begin()+j); sp[i]->remove_sprite(); sp.erase(sp.begin()+i); break; } }}判斷地圖上的點是否可走,有蛋的地方不能行走,地圖上有障礙物的地方不能行走,w->get_on_location(x,y)。得到的是地圖上在點(x,y)點處的值,這個值只為0或是1,1為不可走。WIDTHNUM、HEIGHTNUM分別代表的是地圖的寬度和高度實現(xiàn)代碼為:if(x>=WIDTHNUM||x<0||y>=HEIGHTNUM||y<0) returnfalse; if(w->get_on_location(x,y)!=1) { for(inti=0;i<eggs.size();i++) if(eggs[i]->loc->x==x&&eggs[i]->loc->y==y) returnfalse; for(inti=0;i<ill_eggs.size();i++) if(ill_eggs[i]->loc->x==x&&ill_eggs[i]->loc->y==y) returnfalse; for(inti=0;i<health_eggs.size();i++) if(health_eggs[i]->loc->x==x&&health_eggs[i]->loc->y==y) returnfalse; returntrue; } else returnfalse;得到雞所能走的方向,并隨機的讓小雞向可以行走的方向行走,locx、locy、locx1、locy1、locx2、locy2分別為徑直方向上的橫縱坐標(biāo),左邊的橫縱坐標(biāo),右邊的橫縱坐標(biāo),is_available(locx,locy,w)就是上面所說的判斷雞所能走的點。實現(xiàn)代碼為:locx=i->get_straight_loc().x;locy=i->get_straight_loc().y; locx1=i->get_left_loc().x;locy1=i->get_left_loc().y; locx2=i->get_right_loc().x;locy2=i->get_right_loc().y; 當(dāng)3個方向都可以行走時,隨機的選擇一個方向 if(is_available(locx,locy,w)+is_available(locx1,locy1,w)+is_available(locx2,locy2,w)==3) { intnum=rand(); if(num%3==0) i->turn_left(); elseif(num%3==1) i->turn_right(); } 當(dāng)只有兩個方向可以行走時,隨機選擇一個方向行走 elseif(is_available(locx,locy,w)+is_available(locx1,locy1,w)+is_available(locx2,locy2,w)==2) { 徑直方向不能行走時,隨機選擇向左或是向右行走 if(is_available(locx,locy,w)==false) { if(rand()%2==0) i->turn_left(); else i->turn_right(); } 向左方向不能行走時,隨機選擇向右或是向前行走 elseif(is_available(locx1,locy1,w)==false) { if(rand()%2==1) i->turn_right(); }向右方向不能行走時,隨機選擇向左或是向前行走 else { if(rand()%2==1) i->turn_left(); } } elseif(is_available(locx,locy,w)+is_available(locx1,locy1,w)+is_available(locx2,locy2,w)==1) { if(is_available(locx1,locy1,w)==true) i->turn_left(); elseif(is_available(locx2,locy2,w)==true) i->turn_right(); }Number(道具管理器)道具管理器重管理中骷髏頭、火、藥劑。結(jié)構(gòu)圖如圖4.8所示:圖4.8游戲場景結(jié)構(gòu)圖三種道具的實現(xiàn)方法類似,在這里只討論藥劑的。由于是將道具設(shè)置為可觸碰的,故應(yīng)重載下面的3種方法,同時在初始化時,將是否可點擊設(shè)置為true,setTouchEnabled(true) virtualboolccTouchBegan(cocos2d::CCTouch*pTouch,cocos2d::CCEvent*pEvent); virtualvoidccTouchMoved(cocos2d::CCTouch*pTouch,cocos2d::CCEvent*pEvent); virtualvoidccTouchEnded(cocos2d::CCTouch*pT

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論