




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、梧州學(xué)院課程設(shè)計(jì)課程:智能手機(jī)軟件開發(fā)技術(shù)題目:基于安卓的植物大戰(zhàn)僵尸學(xué)院: 信息與電子工程學(xué)院 專業(yè)班級(jí):12軟件工程1班 學(xué)生學(xué)號(hào): 201200208114 學(xué)生姓名:梁慶 目錄一、安卓手游概述手機(jī)游戲,就是指在手機(jī)上運(yùn)行的游戲軟件。目前用來(lái)編寫安卓手機(jī)程序使用最多的是 JAVA 語(yǔ)言。隨著科技的快速發(fā)展,目前手機(jī)的硬件更新速度越來(lái)越快,功能也越來(lái)越強(qiáng)大。而現(xiàn)在的手機(jī)游戲也不是諾基亞時(shí)代風(fēng)靡全球的那些依托于掌上游戲機(jī)的“俄羅斯方塊”、“貪吃蛇”等畫面簡(jiǎn)陋,規(guī)則簡(jiǎn)單的游戲,進(jìn)而發(fā)展到了可以和掌上游戲機(jī)媲美,具有很強(qiáng)的娛樂性和交互性的復(fù)雜形態(tài)。作為運(yùn)行在手持移動(dòng)終端設(shè)備上的應(yīng)用程序,手機(jī)的硬
2、件特征決定了手機(jī)游戲的特點(diǎn):首先是其龐大的潛在用戶群,據(jù)最新調(diào)查統(tǒng)計(jì),2015年底全球使用智能手機(jī)的人口即將達(dá)到25億,超過全球人口的三分之一,而且這個(gè)數(shù)字每天都在不斷增加,另外,ANDROID市場(chǎng)份額占84.7%。在除美國(guó)之外的各個(gè)發(fā)達(dá)國(guó)家,手機(jī)用戶都比計(jì)算機(jī)用戶多。手機(jī)游戲潛在的市場(chǎng)比其他任何平臺(tái)都要大。其次是其便攜性,在控制臺(tái)游戲時(shí)代,掌上游戲機(jī)熱銷的一個(gè)原因就是便攜性人們可以隨時(shí)隨地沉浸在自己喜歡的游戲中。和游戲控制臺(tái)或者PC 相比,手機(jī)雖然可能不是一個(gè)專業(yè)的游戲設(shè)備, 但畢竟人們總是隨時(shí)隨身攜帶,這樣手機(jī)游戲很可能成為人們消遣時(shí)間的首選。更重要的是其支持網(wǎng)絡(luò),由于手機(jī)是網(wǎng)絡(luò)設(shè)備,在一
3、定限制因素下可以實(shí)現(xiàn)多人在線游戲。為什么要開發(fā)ANDROID版本的游戲。一是源于其技術(shù)優(yōu)勢(shì):一方面是其穩(wěn)定性,現(xiàn)在已有公認(rèn)最穩(wěn)定版本ANDROID 5.0操作系統(tǒng)LOLLIPOP(棒棒糖)。另一方面是程序員技術(shù)入門快,對(duì)有一定JAVA語(yǔ)言基礎(chǔ)的人來(lái)說(shuō),學(xué)習(xí)和掌握ANDROID開發(fā)技術(shù)非??臁6窃从贏NDROID手機(jī)操作系統(tǒng)的市場(chǎng)優(yōu)勢(shì):自GOOGLE在2008年9月正式發(fā)布ANDROID 1.0系統(tǒng)以來(lái),ANDROID系統(tǒng)在短短的3年時(shí)間就占據(jù)全球智能機(jī)市場(chǎng)48%的份額,如今已經(jīng)增長(zhǎng)至84.7%,遠(yuǎn)遠(yuǎn)超過IOS,穩(wěn)坐全球第一。更需要特別說(shuō)明的一點(diǎn):開發(fā)周期短,是一個(gè)很大的優(yōu)勢(shì)。熟悉手機(jī)游戲市場(chǎng)
4、的人都知道,手機(jī)游戲形式更新?lián)Q代的周期很短,如果一旦錯(cuò)過了最佳發(fā)布時(shí)間,即使開發(fā)出來(lái)的產(chǎn)品再好,也只能成為廢品。二、開發(fā)工具的介紹開發(fā)此款游戲主要使用到的工具有四種:ECLIPSE,是一個(gè)開放源代碼的、基于JAVA的可擴(kuò)展開發(fā)平臺(tái);ADT,是ECLIPSE平臺(tái)下用來(lái)開發(fā)ANDROID應(yīng)用程序的插件;ANDROID SDK,是ANDROID專屬的軟件開發(fā)工具包; FIREWORKS,是ADOBE推出的一款圖形編輯軟件。2.1 ECLIPSEECLIPSE是著名的跨平臺(tái)的自由集成開發(fā)環(huán)境(IDE)。其本身只是一個(gè)框架平臺(tái),但是眾多插件的支持使得ECLIPSE擁有其他功能相對(duì)固定的IDE軟件很難具有
5、的靈活性。許多軟件開發(fā)商以ECLIPSE為框架開發(fā)自己的IDE,因此得到了眾多組織定力支持。2.2 ADT這是Eclipse插件,作用是關(guān)聯(lián)Android SDK,使Eclipse能夠新建Android工程。2.3 ANDROID SDKANDROID SDK全稱為ANDROID SOFTWARE DEVELOPMENT KIT,它提供了在WINDOWS/LINUX/MAC平臺(tái)上開發(fā)ANDROID應(yīng)用的開發(fā)組件。包含了在ANDROID平臺(tái)上開發(fā)移動(dòng)應(yīng)用程序的各種工具集,主要是由以下5個(gè)部分組成:ANDRIOD模擬器(AVDMANAGER.EXE):運(yùn)行在計(jì)算機(jī)上的虛擬移動(dòng)模擬器,可以使用模擬器
6、來(lái)在一個(gè)實(shí)際的ANDROID運(yùn)行環(huán)境下設(shè)計(jì),調(diào)試和測(cè)試應(yīng)用程序。調(diào)試監(jiān)視服務(wù)(DDMS.BAT):它集成在DALVIK(ANDROID平臺(tái)虛擬機(jī))中,用于管理運(yùn)行在模擬器或設(shè)備上的進(jìn)程,并協(xié)助進(jìn)行調(diào)試??梢杂盟鼇?lái)去除進(jìn)程,選擇一個(gè)特定程序來(lái)調(diào)試,生成跟蹤數(shù)據(jù),查看堆和線程數(shù)據(jù),對(duì)模擬器或設(shè)備進(jìn)行屏幕快照等。ANDROID調(diào)試(ADB.EXE):它用于向模擬器或手機(jī)設(shè)備安裝應(yīng)用程序的APK文件和從命令行訪問模擬器或手機(jī)設(shè)備.也可以用于將標(biāo)準(zhǔn)的調(diào)試器連接到運(yùn)行在ANDROID模擬器或手設(shè)備上的應(yīng)用代碼。SQLITE3數(shù)據(jù)庫(kù)(SQLIT3(SQLITE3.EXE):ANDROID應(yīng)用程序可以創(chuàng)建和使
7、用SQLITE數(shù)據(jù)文件,開發(fā)者和使用者也可以方便的訪問這些數(shù)據(jù)文件創(chuàng)建SD卡工具(MKSDCARD(MKSDCARD.EXE)2.4 FIREWORKSFireworks是Macromedia公司發(fā)布的一款專為網(wǎng)絡(luò)圖形設(shè)計(jì)的圖形編輯軟件,它大大簡(jiǎn)化了網(wǎng)絡(luò)圖形設(shè)計(jì)的工作難度,無(wú)論是專業(yè)設(shè)計(jì)家還是業(yè)余愛好者,使用Fireworks都不僅可以輕松地制作出十分動(dòng)感的GIF動(dòng)畫,還可以輕易地完成大圖切割、動(dòng)態(tài)按鈕、動(dòng)態(tài)翻轉(zhuǎn)圖等。三、技術(shù)介紹 該設(shè)計(jì)主要使用了SurfaceView游戲框架,采用雙緩存技術(shù)避免屏幕出現(xiàn)閃爍。3.1 SURFACEVIEWSurfaceView可以直接從內(nèi)存或者DMA等硬件接
8、口取得圖像數(shù)據(jù),是個(gè)非常重要的繪圖容器。它的特性是:可以在主線程之外的線程中向屏幕繪圖上。這樣可以避免畫圖任務(wù)繁重的時(shí)候造成主線程阻塞,從而提高了程序的反應(yīng)速度。在游戲開發(fā)中多用到SurfaceView,游戲中的背景、人物、動(dòng)畫等等盡量在畫布Canvas中畫出。3.2 雙緩存窗體在刷新時(shí),總要有一個(gè)擦除原來(lái)圖象的過程,它利用背景色填充窗體繪圖區(qū),然后再調(diào)用新的繪圖代碼進(jìn)行重繪,這樣一擦一寫造成了圖象顏色的反差,造成閃爍。閃爍是圖形編程的一個(gè)常見問題。需要多重復(fù)雜繪制操作的圖形操作會(huì)導(dǎo)致呈現(xiàn)的圖像閃爍或具有其他不可接受的外觀。當(dāng)數(shù)據(jù)量很大時(shí),繪圖可能需要幾秒鐘甚至更長(zhǎng)的時(shí)間,閃爍現(xiàn)象會(huì)更加嚴(yán)重,
9、為了解決這些問題,可采用雙緩沖技術(shù)來(lái)繪圖。3.3 Cocos2d-android游戲引擎cocos2d是一個(gè)基于MIT協(xié)議的開源框架,用于構(gòu)建游戲、應(yīng)用程序和其他圖形界面交互應(yīng)用。可以讓你在創(chuàng)建自己的多平臺(tái)游戲時(shí)節(jié)省很多的時(shí)間。Cocos2D也擁有幾個(gè)主要版本,包括Cocos2D-iPhone、Cocos2D-X,以及被社區(qū)普遍看好的Cocos2D-HTML5和JavaScriptbindings for Cocos2D-X。同時(shí)也擁有了非常優(yōu)秀的編輯器(獨(dú)立編輯器),例如SpriteSheet Editors、Particle Editors 、Font Editors 、 Tilemap
10、Editors。另外,2012年發(fā)布的CocoStudio工具集是開源游戲引擎Cocos2d-x開發(fā)團(tuán)隊(duì)官方推出的游戲開發(fā)工具,目前已經(jīng)進(jìn)入穩(wěn)定版。CocoStudio吸取了他們自己在游戲制作中的經(jīng)驗(yàn),為移動(dòng)游戲開發(fā)者和團(tuán)隊(duì)量身定做,旨在降低游戲開發(fā)的門檻,提高開發(fā)效率,同時(shí)也為Cocos2D-X的進(jìn)一步發(fā)展打下基礎(chǔ)。四、系統(tǒng)功能系統(tǒng)主要有以下幾個(gè)功能4.1 項(xiàng)目概述 本項(xiàng)目分為五個(gè)主要部分:常規(guī)、夜晚、無(wú)盡三個(gè)模式進(jìn)行游戲,和游戲設(shè)置與查看幫助。用例圖如圖2.1。圖 2.1 系統(tǒng)用例圖4.2 項(xiàng)目概述4.2.1 常規(guī)模式此部分主要實(shí)現(xiàn)玩家在游戲背景為白天的情況下玩游戲。該部分具體情況如表2.
11、1。表 2.1 常規(guī)模式用例名稱常規(guī)模式功能簡(jiǎn)述在常規(guī)模式下進(jìn)行游戲前置條件玩家進(jìn)入游戲后置條件進(jìn)入常規(guī)模式開始游戲基本流1、 點(diǎn)擊主菜單頁(yè)面“常規(guī)模式”按鈕,進(jìn)入常規(guī)模式開始游戲2、 點(diǎn)擊“返回”按鈕,用例終止4.2.2 夜晚模式此部分主要實(shí)現(xiàn)玩家在游戲背景為夜晚的情況下玩游戲。該部分具體情況如表2.2。表 2.2 夜晚模式用例名稱夜晚模式功能簡(jiǎn)述在夜晚模式下進(jìn)行游戲前置條件玩家進(jìn)入游戲后置條件進(jìn)入夜晚模式開始游戲基本流1、 點(diǎn)擊主菜單頁(yè)面“夜晚模式”按鈕,進(jìn)入夜晚模式開始游戲2、 點(diǎn)擊“菜單”按鈕游戲暫停并進(jìn)入主菜單3、 點(diǎn)擊“夜晚模式”回到游戲4、 點(diǎn)擊“返回”按鈕,用例終止4.2.3
12、無(wú)盡模式此部分主要實(shí)現(xiàn)游戲玩家在常規(guī)或者夜晚模式通關(guān)的情況下玩游戲。該部分具體情況如表2.3。表 2.3 無(wú)盡模式用例名稱無(wú)盡模式功能簡(jiǎn)述在無(wú)盡模式下進(jìn)行游戲前置條件玩家在常規(guī)或者夜晚模式通關(guān)后置條件進(jìn)入常規(guī)模式開始游戲基本流1、 點(diǎn)擊主菜單頁(yè)面“無(wú)盡模式”按鈕,進(jìn)入無(wú)盡模式開始游戲2、 點(diǎn)擊“菜單”按鈕游戲暫停并進(jìn)入主菜單3、 點(diǎn)擊“無(wú)盡模式”回到游戲4、 點(diǎn)擊“返回”按鈕,用例終止4.2.4 游戲設(shè)置此部分主要實(shí)現(xiàn)對(duì)游戲背景音樂、效果音的開啟和關(guān)閉。該部分具體情況如表2.4。表 2.4 無(wú)盡模式用例名稱游戲設(shè)置功能簡(jiǎn)述打開、關(guān)閉游戲背景音樂或者效果音前置條件想要對(duì)游戲進(jìn)行設(shè)置后置條件游戲?qū)?/p>
13、性改變基本流1、 點(diǎn)擊主菜單頁(yè)面“選項(xiàng)”按鈕,進(jìn)入“游戲設(shè)置”界面2、 在游戲設(shè)置界面中,根據(jù)需要進(jìn)行設(shè)置3、 設(shè)置之后自動(dòng)返回主菜單或者不設(shè)置點(diǎn)擊“返回”按鈕,用例終止4.2.5 關(guān)卡選擇此部分主要實(shí)現(xiàn)玩家根據(jù)自己喜好選擇在哪個(gè)游戲關(guān)卡下玩游戲。但是不能選擇沒有通過的關(guān)卡。4.2.6 查看幫助此部分主要實(shí)現(xiàn)游戲玩家查看幫助。五、概要設(shè)計(jì)5.1 游戲設(shè)計(jì)5.1.1 游戲背景人類與僵尸之間的仇恨由來(lái)已久,為了爭(zhēng)奪生存空間,僵尸一有機(jī)會(huì)就向人類發(fā)起攻擊。但是人類也不會(huì)束手就擒,他們培養(yǎng)出了可以對(duì)僵尸造成傷害的植物,當(dāng)僵尸進(jìn)攻時(shí)這些植物就是人類捍衛(wèi)家園的武器。5.1.2 游戲邏輯(1)僵尸是進(jìn)攻方,
14、人類通過種植培育出的各種進(jìn)攻,防御型植物來(lái)抵抗僵尸的進(jìn)攻。想要植物成長(zhǎng)來(lái)攻擊,防御僵尸需要相應(yīng)的陽(yáng)光值。(2)不同的關(guān)卡中,供選擇的植物不同,僵尸進(jìn)攻的單位也不同。例如第一關(guān)只有普通僵尸進(jìn)攻,第二關(guān)就會(huì)出現(xiàn)兩種僵尸。(3)在交戰(zhàn)區(qū),玩家要種植進(jìn)攻,防御單位是需要植物的,所以還需要種植產(chǎn)生陽(yáng)光的生產(chǎn)單位。(4)每關(guān)都有相應(yīng)的敵人數(shù)量,全部消滅之后過關(guān)。如果有敵人穿過交戰(zhàn)區(qū)域到達(dá)人類后方,則判定游戲失敗。5.1.3 僵尸作戰(zhàn)單位(1)普通僵尸。移動(dòng)速度1px/幀,生命值3,吃掉植物需要3s。(2)戴帽子僵尸。移動(dòng)速度1px/幀,生命值4,吃掉植物需要3s。(3)戴鐵桶僵尸。移動(dòng)速度1px/幀,生命
15、值5,吃掉植物需要3s。(4)運(yùn)動(dòng)員僵尸。移動(dòng)速度2px/幀,生命值3,吃掉植物需要3s。(5)佩戴鐵網(wǎng)僵尸。移動(dòng)速度1px/幀,生命值6,吃掉植物需要3s。5.1.4 植物作戰(zhàn)單位(1)向日葵。消耗陽(yáng)光值50,能夠生產(chǎn)陽(yáng)光,每10s生產(chǎn)的陽(yáng)光值為50,沒有攻擊力。(2)普通豌豆射手。消耗陽(yáng)光值100,每5s發(fā)射一顆子彈,攻擊力為1。(3)冰凍豌豆射手。消耗陽(yáng)光值175,每5s發(fā)射一顆子彈,攻擊力為1。(4)加強(qiáng)型豌豆射手。消耗陽(yáng)光值200,每5s發(fā)射兩顆連續(xù)的子彈,每顆子彈攻擊力為1。(5)土豆衛(wèi)士。消耗陽(yáng)光值50,可以抵擋僵尸3s,為其他攻擊植物爭(zhēng)取時(shí)間。5.1.5 每關(guān)進(jìn)攻的僵尸及可以種
16、植的植物說(shuō)明第一關(guān),進(jìn)攻的僵尸有普通僵尸,可以選擇種植向日葵,普通豌豆射手。第二關(guān),進(jìn)攻的僵尸有普通僵尸,戴帽子僵尸,可以選擇種植向日葵,普通豌豆射手,冰凍豌豆射手。第三關(guān),進(jìn)攻的僵尸有普通僵尸,戴帽子僵尸,戴鐵桶僵尸,可以選擇種植向日葵,普通豌豆射手,冰凍豌豆射手,加強(qiáng)型豌豆射手。第四關(guān),進(jìn)攻的僵尸有普通僵尸,戴帽子僵尸,戴鐵桶僵尸,運(yùn)動(dòng)員僵尸,可以選擇種植向日葵,普通豌豆射手,冰凍豌豆射手,加強(qiáng)型豌豆射手,土豆衛(wèi)士。第五關(guān),進(jìn)攻的僵尸有普通僵尸,戴帽子僵尸,戴鐵桶僵尸,運(yùn)動(dòng)員僵尸,佩戴鐵網(wǎng)僵尸,可以選擇種植向日葵,普通豌豆射手,冰凍豌豆射手,加強(qiáng)型豌豆射手,土豆衛(wèi)士。5.1.6 關(guān)卡說(shuō)明總
17、共有五條防御路線。每條防御路線最多可以放九個(gè)單位。僵尸在屏幕之外生成,隨機(jī)出現(xiàn)在五條路線中的一條,之后緩緩向人類后方前進(jìn)。每關(guān)都有相應(yīng)的僵尸數(shù)量,全部消滅之后就過關(guān)。如果敵人穿過交戰(zhàn)區(qū)域到達(dá)人類后方,則判定游戲失敗。5.1.7 碰撞邏輯說(shuō)明僵尸從屏幕右方向左移動(dòng),當(dāng)僵尸生成之后,如果該條路線種植了攻擊性植物,將開始發(fā)射子彈。子彈,植物與僵尸碰撞大小區(qū)域即為圖片大小區(qū)域,當(dāng)兩者發(fā)生接觸后即發(fā)生碰撞。子彈與僵尸碰撞之后隨即消失,僵尸生命值隨即相應(yīng)減少。子彈超過屏幕右邊界后消失。5.1.8 狀態(tài)播放規(guī)則所有植物素材均為8幀,僵尸素材為7幀。每100ms播放一幀,播放完畢之后自動(dòng)從第一針開始重新播放,
18、如此循環(huán)。5.2 軟件架構(gòu)根據(jù)前面的需求分及用戶的基本要求,軟件的總體結(jié)構(gòu)設(shè)計(jì)包括有軟件加載、主界面、主要功能選擇、模式選擇、開始游戲、游戲設(shè)置等。軟件的總體架構(gòu)如圖3.1。圖 3.1 軟件總體架構(gòu)圖軟件加載:用戶打開游戲后進(jìn)行游戲加載歡迎用戶使用該軟件;主界面:主要展現(xiàn)游戲整體的功能界面;模式選擇:玩家根據(jù)自身喜好決定并選擇在何種模式下進(jìn)行游戲;開始游戲:實(shí)現(xiàn)植物大戰(zhàn)僵尸的功能;游戲設(shè)置:實(shí)現(xiàn)對(duì)游戲各種屬性進(jìn)行設(shè)置的功能。5.3 軟件功能結(jié)構(gòu)圖根據(jù)總體設(shè)計(jì)例圖,分析出程序功能主要包括:游戲加載、游戲模式選擇、關(guān)卡選擇、游戲設(shè)置、游戲幫助。主要根據(jù)軟件基本設(shè)計(jì)模塊來(lái)設(shè)計(jì)這些功能,軟件總體功能結(jié)
19、構(gòu)如圖3.2。圖 3.2 軟件功能結(jié)構(gòu)圖5.4 軟件具體功能模塊基本介紹根據(jù)游戲的具體功能模塊:主要功能選擇、游戲音效開關(guān)、模式選擇、關(guān)卡選擇、查看幫助幫助等功能模塊。植物大戰(zhàn)僵尸游戲功能模塊有以下功能:5.4.1 主要模塊選擇功能該模塊其實(shí)就相當(dāng)于植物大戰(zhàn)僵尸游戲的主菜單,在該模式下,玩家可以對(duì)游戲?qū)傩赃M(jìn)行設(shè)置,根據(jù)自己的喜好選擇如何開始游戲,以及查看游戲幫助等所有該游戲提供給玩家的功能。游戲狀態(tài)為MENU時(shí)激活該模塊,之后根據(jù)玩家在不同位置的觸屏事件調(diào)用相關(guān)的功能模塊,在玩家點(diǎn)擊設(shè)備返回按鈕時(shí)退出游戲。功能選擇模塊流程如圖3.3。5.4.2 游戲聲音開關(guān)功能游戲默認(rèn)關(guān)閉背景音效和效果音,玩
20、家可以根據(jù)自己愛好選擇是否開啟背景音樂或者游戲效果音。在主菜單中點(diǎn)擊“選項(xiàng)”按鈕,玩家則進(jìn)入聲音設(shè)置功能,因?yàn)槟J(rèn)關(guān)閉背景音,這時(shí)會(huì)顯示開啟音樂,如果音樂開啟后再次進(jìn)入聲音設(shè)置功能將顯示關(guān)閉音樂。游戲效果音顯示與背景音效相同。圖 3.3 功能選擇模塊流程圖5.4.3 模式選擇功能該游戲分三種模式,常規(guī)、夜晚和無(wú)盡模式。打開游戲后因?yàn)檫€沒有通關(guān)(總共五個(gè)關(guān)卡),所以不能選擇無(wú)盡模式游戲。這時(shí)玩家可以在常規(guī)模式和夜晚模式中進(jìn)行選擇,在通過所有關(guān)卡之后,將封鎖常規(guī)和夜晚模式,玩家只能選擇無(wú)盡模式。不管哪種模式,選擇之后自動(dòng)開始游戲。5.4.4 關(guān)卡選擇功能游戲分為5個(gè)關(guān)卡,每關(guān)有不同數(shù)量的僵尸且依次
21、遞增,玩家通過種植植物道具來(lái)消滅僵尸,待本關(guān)所有僵尸均消滅之后游戲自動(dòng)進(jìn)入下一關(guān),并且玩家得到的獎(jiǎng)勵(lì)將顯示在屏幕中的種子欄中,顯示之后玩家就可以選擇它進(jìn)行種植,當(dāng)然前提是陽(yáng)光值大于等于該植物所需要消耗的值,陽(yáng)光可以通過種植向日葵來(lái)得到,種的越多獲得陽(yáng)光值的速度越快。為了避免作弊,關(guān)卡選擇只對(duì)玩家通過的關(guān)卡有效。5.4.5 查看幫助功能每款軟件都具有幫助功能,該游戲也不能例外。在查看完幫助之后點(diǎn)擊屏幕或者設(shè)備返回鍵將會(huì)自動(dòng)轉(zhuǎn)到主菜單界面。六、界面設(shè)計(jì)軟件用戶界面是指軟件用于和用戶交流的外觀、部件和程序等等。為了使該游戲在界面上達(dá)到吸引眼球的目的,結(jié)合了圖形和版面設(shè)計(jì)的相關(guān)原理對(duì)其界面進(jìn)行了美化、
22、規(guī)范化的設(shè)計(jì)。6.1 結(jié)構(gòu)設(shè)計(jì)根據(jù)對(duì)軟件架構(gòu)的分析,知道游戲應(yīng)該有以下界面:歡迎界面(游戲加載)、游戲主菜單、關(guān)卡選擇界面、游戲設(shè)置界面、查看幫助界面、勝利界面、失敗界面、游戲界面。打開軟件之后顯示到歡迎界面、點(diǎn)擊“開始游戲”之后界面轉(zhuǎn)到主菜單界面,之后用戶根據(jù)需要選擇各種功能后轉(zhuǎn)到相應(yīng)界面,不同界面之間的跳轉(zhuǎn)關(guān)系如圖4.1。圖 4.1 界面跳轉(zhuǎn)關(guān)系圖6.2 交互設(shè)計(jì)該游戲?yàn)锳ndroid中文版,因此界面語(yǔ)言選擇使用中文。每個(gè)頁(yè)面都添加有onTouch()函數(shù)和onKeyDown()函數(shù)以響應(yīng)用戶觸屏和點(diǎn)擊按鍵事件,其功能都是退出本頁(yè)面,在歡迎、主菜單界面點(diǎn)擊退出按鈕則是退出游戲,這么設(shè)置主要
23、是為了程序方便退出。主菜單實(shí)現(xiàn)了程序功能選擇功能,其實(shí)它就相當(dāng)于實(shí)現(xiàn)了程序?qū)Ш焦δ堋V鞑藛谓缑嬖O(shè)計(jì)如圖4.2。游戲界面有一個(gè)種子收集欄,點(diǎn)擊該區(qū)域相應(yīng)種子之后將其拖動(dòng)到種植區(qū)域就能將植物種植,種植區(qū)分為五個(gè)橫著的跑到,每行都有僵尸進(jìn)攻。游戲界面設(shè)計(jì)如圖4.3。6.3 視覺設(shè)計(jì) 游戲采用綠色為主色調(diào),這是大部分植物的顏色,色彩與內(nèi)容符合。角色造型使用卡通設(shè)計(jì)表現(xiàn)形式顯得滑稽、可愛。圖 4.2 主菜單界面設(shè)計(jì)圖 圖 4.3 游戲界面設(shè)計(jì)圖七、詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)植物大戰(zhàn)僵尸游戲采用面向?qū)ο蟮姆椒ㄟM(jìn)行設(shè)計(jì),在對(duì)象設(shè)計(jì)過程中將程序中各種事物都看成是對(duì)象,復(fù)雜的對(duì)象可以由比較簡(jiǎn)單的對(duì)象以某種方式組合而成。把對(duì)
24、象劃分為對(duì)象類,為他們定義數(shù)據(jù)與方法。建立子類與父類的結(jié)構(gòu)關(guān)系。將需要使用的圖片準(zhǔn)備好,需要修改的用Fireworks修改,最后使用Java代碼將該游戲各個(gè)部分描述出來(lái)。5.1 搭建游戲基本骨架5.1.1 SURFACEVIEW框架在Android系統(tǒng)中創(chuàng)建植物大戰(zhàn)僵尸游戲的實(shí)現(xiàn)方法,需要使用到SurfaceView游戲框架,它主要是用來(lái)開發(fā)復(fù)雜的游戲,在要求程序執(zhí)行效率很高時(shí),例如對(duì)速度要求很高的游戲,可以使用雙緩沖來(lái)顯示。游戲中的背景、人物都繪制在一個(gè)畫布上,而Surfaceview可以直接訪問一個(gè)畫布。因?yàn)橄到y(tǒng)默認(rèn)建立豎屏項(xiàng)目,所以首先在AndroidManifest.xml配置文件的里
25、添加代碼android:screenOrientation=landscape將屏幕設(shè)置為橫屏顯示。定義一個(gè)類“MainSurfaceView”,此類繼承SurfaceView,除此之外還要實(shí)現(xiàn)和Runnable接口。在其中定義了一個(gè)SurfaceHolder類的實(shí)例,該類可以為提供SurfaceView的大小,格式等,并且主要用于監(jiān)聽SurfaceView的狀態(tài)。我們是通過SurfaceHolder來(lái)控制SurfaceView的,使用lockCanvas()函數(shù)來(lái)獲取到SurfaceView的Canvas對(duì)象,再通過在Canvas上繪制內(nèi)容來(lái)修改SurfaceView中的數(shù)據(jù)。為了防止Sur
26、faceView在繪制過程中被修改、摧毀等發(fā)生的狀態(tài)改變,要用lockCanvas()函數(shù)對(duì)Canvas畫布進(jìn)行加鎖,在繪制完成后還要使用unlockCanvasAndPostt()函數(shù)來(lái)解鎖畫布和提交。因此繪畫函數(shù)總是在這兩個(gè)函數(shù)之間進(jìn)行調(diào)用。根據(jù)界面設(shè)計(jì),在該類中定義表示游戲各種狀態(tài)的整型常量:GAME_MUNU、GAME_WELCOME、GAME_INGDAY、GAEM_WIN、GAME_LOST、GAME_SELECT等將他們初始化。定義畫圖函數(shù)myDraw(),里面使用switch()語(yǔ)句實(shí)現(xiàn)在不同游戲狀態(tài)下的游戲繪圖。onTouchEvent()函數(shù)同樣這么處理。在游戲中,基本不會(huì)
27、等用戶每次觸發(fā)了按鍵事件、觸屏事件才去重繪畫布,而是會(huì)固定一個(gè)時(shí)間去刷新畫布,比如僵尸單位前進(jìn)時(shí)向前邁步、植物單位的動(dòng)態(tài)顯示、子彈前進(jìn)等并不會(huì)跟玩家交互,但是這些元素都是動(dòng)態(tài)的。所以游戲開發(fā)中,要設(shè)置一個(gè)線程不停的去重繪畫布,實(shí)時(shí)的更新游戲元素的狀態(tài)。因此在實(shí)現(xiàn)run()方法時(shí),要使用while循環(huán)在循環(huán)標(biāo)志為真的情況下每隔一段時(shí)間調(diào)用繪畫函數(shù),這一段時(shí)間到底要多長(zhǎng)呢?無(wú)疑這必須要根據(jù)人眼視覺暫留的特性來(lái)確定。比如一個(gè)視頻,如果幀數(shù)達(dá)到24幀,那么這個(gè)視頻播放起來(lái)人眼是感覺不到卡頓的。24幀意思就是每秒播放24張圖片。為了讓程序達(dá)到每秒繪制將近24次,讓程序每次開始繪制到下一次開始繪制的時(shí)間保
28、持在50ms之內(nèi),一秒繪制20次,這已經(jīng)能夠滿足該游戲的需求了。接下來(lái)修改MainActivity類,onCreate(Bundle savedInstanceState)函數(shù),用setContentView(new MainSurfaceView(this)讓其顯示自定義的SurfaceView視圖,使用requestWindowFeature(Window.FEATURE_NO_TITLE)隱去標(biāo)題欄,再使用getWindow().setFlags()函數(shù)隱去狀態(tài)欄。定義init()函數(shù)將Config類中定義的各種位圖初始化。5.1.2 Welcome類這是定義的歡迎界面的類,定義了開始游
29、戲按鈕的橫縱坐標(biāo)等,它的draw()函數(shù)繪制了歡迎界面背景和圖片按鈕。onTouchEvent()函數(shù)的功能是玩家在圖片按鈕區(qū)域觸發(fā)ACTION_DOWN事件后,控制顯示表示按鈕被按下的圖片。當(dāng)玩家在按鈕區(qū)域觸發(fā)ACTION_UP事件后,按鈕圖片顯示為未按下狀態(tài)并使用MainSurfaceView.gameState = MainSurfaceView.GAME_MENU代碼將游戲轉(zhuǎn)到主菜單界面。5.1.3 Menu類游戲主菜單,其中用boolean類型定義了所有按鈕是否按下的狀態(tài),并將它們?nèi)砍跏蓟癁閒alse。將“常規(guī)模式”、“夜晚模式”、“無(wú)盡模式”、“退出”等按鈕按照主菜單界面設(shè)計(jì)中的
30、布局繪制好。在ACTION_DOWN或者ACTION_MOVE事件中檢測(cè)每個(gè)按鈕的狀態(tài)(是否被按下),如果是,則在draw()函數(shù)中繪制被按下狀態(tài)的相應(yīng)圖片按鈕。在ACTION_UP事件中將被釋放按鈕的狀態(tài)修正并轉(zhuǎn)到相應(yīng)的游戲狀態(tài),比如點(diǎn)擊“幫助”后調(diào)用MainSurfaceView.gameState = MainSurfaceView.GAME_HELP改變游戲狀態(tài)。如果點(diǎn)擊“退出”,調(diào)用System.exit(0)直接退出游戲。5.1.4 Option類實(shí)現(xiàn)游戲聲音設(shè)置功能。繪制完背景之后再繪制未按下狀態(tài)的聲音開關(guān)按鈕。玩家在按鈕區(qū)域點(diǎn)擊一次該按鈕,onTouchEvent()函數(shù)將變量
31、Config.isPlayMusic取反,如果該值為真則播放背景音樂,如果為假則停止播放背景音樂,并調(diào)用MainSurfaceView.backgroundMusic.prepare()函數(shù)為下一次開啟背景音樂做準(zhǔn)備。完成這些動(dòng)作之后將游戲轉(zhuǎn)到主菜單。5.1.5 Help類Help類是給玩家提供幫助信息,把幫助內(nèi)容寫在一張圖片上,玩家需要幫助時(shí)打開該功能,該類把幫助圖片繪制在屏幕上,玩家可查看幫助??赐曛簏c(diǎn)擊屏幕觸發(fā)ACTION_UP事件,游戲轉(zhuǎn)到主菜單界面。5.1.6 Select類該類為玩家提供選擇關(guān)卡功能。玩家點(diǎn)擊屏幕并在相應(yīng)關(guān)卡位置觸發(fā)ACTION_UP事件后,程序判斷現(xiàn)在已通過最高
32、關(guān)卡Config.tempLevel是否大于或者等于用戶選擇的關(guān)卡,如果成立,則將游戲設(shè)置為玩家選擇關(guān)卡,否則彈出消息提示用戶“該關(guān)卡還沒解鎖”。接著在MainSurfaceView類中將游戲狀態(tài)gameState初始化為GAME_WELCOME,定義上述類的對(duì)象并初始化,在myDraw(),onTouchEvent()函數(shù)相應(yīng)的游戲狀態(tài)下分別調(diào)用這些對(duì)象的draw()和onTouchEvent()函數(shù)。到此游戲基本骨架搭建完成,類圖如圖5.1。圖5.1 游戲框架相關(guān)類圖5.2 游戲model包5.2.1 TOUCHABLE接口Android手機(jī)可見的按鍵非常少,很多除了開機(jī)鍵,音量鍵就只有功
33、能鍵、主菜單鍵、返回鍵,玩家在玩游戲時(shí)都是使用手指觸屏進(jìn)行操作,所以每個(gè)操作對(duì)象都會(huì)響應(yīng)觸摸事件。為了滿足程序的這個(gè)要求,定義了TouchAble接口方便有要求的類實(shí)現(xiàn)。5.2.2 PLANT接口植物單位是需要拖動(dòng)種植的,而種植就需要坐標(biāo),當(dāng)然這個(gè)坐標(biāo)不能隨便選取,因?yàn)樵谥暗姆治鲋芯蛷?qiáng)調(diào)了在植物和僵尸的交戰(zhàn)區(qū)域被分為了五條路線,每條路線有九個(gè)格子可以種植植物單位,植物只能種植在這些規(guī)定好的格子中,這四十五個(gè)格子就必須固定,而且一個(gè)格子只能種植一種植物,不能重復(fù),即使是同一種植物在同一個(gè)格子里也不能種植兩個(gè)。給這個(gè)格子編號(hào)用來(lái)記錄是否種植過植物并且記錄每個(gè)植物種植的位置。所以定義該接口以實(shí)現(xiàn)g
34、etMapIndex()方法。5.2.3 BASEMODEL類在游戲中,不管是植物單位,僵尸單位還是種子欄中的種子圖片,他們都有一些共同的屬性或者方法,比如他們的坐標(biāo),即這些圖片應(yīng)該出現(xiàn)的位置,還有所有對(duì)象想要在設(shè)備屏幕中顯示出來(lái)都要調(diào)用一個(gè)繪畫方法來(lái)把自己畫出來(lái)。根據(jù)面向?qū)ο蟮睦^承性(這個(gè)性質(zhì)無(wú)疑給程序帶來(lái)了許多突出優(yōu)點(diǎn)),為了減少冗余信息,應(yīng)當(dāng)抽取相似類的公共屬性和公共服務(wù)。所以要為程序中一部分類建立父類BaseModel。5.2.4 CONFIG類雖然說(shuō)要盡量避免使用全局變量,不過現(xiàn)在的設(shè)備性能越來(lái)越高,和以前老機(jī)器不可同日而語(yǔ),所以我認(rèn)為這個(gè)問題不是現(xiàn)在最關(guān)注的問題。Config類就是
35、存放游戲中需要使用的各種全局變量的。比如屏幕的寬度和高度,產(chǎn)生陽(yáng)關(guān)、僵尸、子彈的時(shí)間等。為什么要這么做是由原因的,因?yàn)殚_發(fā)過程中需要跑測(cè)試,為了快速完成這個(gè)過程,要修改上述這些變量,如果沒有設(shè)置全局變量將浪費(fèi)大量時(shí)間做重復(fù)的修改操作。該類還定義了游戲中各種對(duì)象所使用的圖片素材。普通類中是不能從圖片工廠中獲得圖片,普通類需要使用圖片只能從構(gòu)造函數(shù)中傳遞進(jìn)去,如果在每個(gè)使用上述普通類的地方都去定義圖片素材并加載圖片,這將使程序顯得相當(dāng)混亂,不好管理。該類還定義了所有適合種植植物點(diǎn)的集合,并將交戰(zhàn)區(qū)域定義為五條路線并準(zhǔn)備對(duì)它們的豎坐標(biāo)進(jìn)行記錄。5.3 游戲具體實(shí)現(xiàn)及相關(guān)的實(shí)體類5.3.1 太陽(yáng)花種植
36、及產(chǎn)生陽(yáng)光實(shí)現(xiàn)SeedFlower類為種子欄中的太陽(yáng)花卡片,繼承自BaseModel,實(shí)現(xiàn)了TouchAble接口。除了定義其顯示的坐標(biāo)、是否存在的成員變量外,還定義了一個(gè)矩形的觸摸區(qū)域。其成員變量及成員方法如圖5.2。圖5.2 SeedFlower類成員變量及成員方法示意圖SeedFlower():SeedFlower類的構(gòu)造函數(shù),其中將所有屬性初始化,需要特別說(shuō)明的是isAlive默認(rèn)為true。drawSelf():繪畫函數(shù),主要實(shí)現(xiàn)太陽(yáng)花種子圖片在各種情況下的顯示情況。具體實(shí)現(xiàn)描述如下。在能夠顯示該種子卡片的情況下,如果當(dāng)前陽(yáng)光值Config.sunshineValue小于種植太陽(yáng)花所
37、需要的陽(yáng)光值Config.flowerCost,將畫筆Alpha值設(shè)置為100,畫太陽(yáng)花。為了不影響其他對(duì)象使用畫筆還需要在畫完太陽(yáng)花后將畫筆Alpha值還原為255。onTouch():觸屏處理函數(shù),在該函數(shù)中首先記錄捕捉的觸摸點(diǎn)坐標(biāo),檢測(cè)touchArea.contains(pointX,pointY) & Config.sunshineValue=Config.flowerCost,如果成立則在該坐標(biāo)顯示一個(gè)即將被種植的植物,這個(gè)功能需要使用定義在Game類里的apply4EmplacePlant(int locationX,int locationY)函數(shù)來(lái)實(shí)現(xiàn)。該函數(shù)會(huì)檢測(cè)即將種植哪
38、種植物并新建一個(gè)即將被種植的植物對(duì)象。EmplaceFlower類是將被種植的太陽(yáng)花類,同樣繼承自BaseModel,實(shí)現(xiàn)TouchAble接口。touchArea:手指觸屏移動(dòng)跟隨區(qū)域,根據(jù)構(gòu)造函數(shù)接收的參數(shù)初始化為即將種植太陽(yáng)花大小的區(qū)域。onTouch():觸屏函數(shù),觸發(fā)ACTON_MOVE事件時(shí),對(duì)該類的橫縱坐標(biāo)進(jìn)行修正,使觸摸點(diǎn)在圖片中心,并使touchArea隨著觸摸點(diǎn)的移動(dòng)而移動(dòng)。響應(yīng)ACTION_UP事件時(shí),將isAlive變量賦值為false,在移除該對(duì)象后調(diào)用Game類中apply4Plant(int locationX,int locationY,BaseModel ba
39、seModel)函數(shù)種植植物。在該函數(shù)會(huì)檢測(cè)種植哪種植物,這里種植太陽(yáng)花,所以會(huì)新建Flower類對(duì)象。Flower類是屏幕上種植的太陽(yáng)花,繼承自BaseModel,實(shí)現(xiàn)了Plant接口。除了具有從父類繼承來(lái)的變量,還具有自己的新整型成員變量:frameIndex,mapIndex和長(zhǎng)整型變量lastShineTime,他們分別表示太陽(yáng)花位圖數(shù)組下標(biāo),所在格子編號(hào),上一次產(chǎn)生陽(yáng)光的時(shí)刻。如圖5.3。圖5.3 Flower類成員變量及成員方法示意圖drawSelf():繪圖函數(shù),繪制當(dāng)前幀的圖片,當(dāng)前幀自加一后對(duì)8取余,當(dāng)現(xiàn)在時(shí)刻減去上一次產(chǎn)生陽(yáng)光時(shí)刻的時(shí)間差大于系統(tǒng)產(chǎn)生陽(yáng)光時(shí)間Config.p
40、roSunshineTime,將上次產(chǎn)生陽(yáng)光時(shí)刻賦值為現(xiàn)在時(shí)刻,調(diào)用Game類中produceSunshine(int locationX,int locationY)函數(shù)來(lái)產(chǎn)生有光,在該函數(shù)中新建Sunshine類對(duì)象。種植植物流程如圖5.4。圖5.4 種植植物流程圖Sunshine類是太陽(yáng)花每隔10s生產(chǎn)出來(lái)的陽(yáng)光。陽(yáng)光產(chǎn)生之后生存5s,如果在這5s之內(nèi)點(diǎn)擊了陽(yáng)光,陽(yáng)光會(huì)移動(dòng)到陽(yáng)光值記錄處,并將陽(yáng)光值增加50,如果超過5s沒有點(diǎn)擊,它會(huì)自動(dòng)消失。為了防止陽(yáng)光在移動(dòng)時(shí)沒有到達(dá)終點(diǎn)就消失,它存在的時(shí)間只在顯示狀態(tài)有效。其實(shí)這種情況是存在的,比如玩家點(diǎn)擊了某個(gè)生存4.99s的陽(yáng)光,理想的效果是它
41、會(huì)從改點(diǎn)移動(dòng)到終點(diǎn)然后消失,但是因?yàn)樗纳鏁r(shí)間只有5s,在這僅剩的0.01s里它還沒有來(lái)得及移動(dòng)到終點(diǎn)就消失,這種情況是不允許的。從上述設(shè)計(jì)可以看出陽(yáng)光有兩種狀態(tài),一種是顯示狀態(tài),另一種是移動(dòng)狀態(tài)。該類中定義了枚舉類型的陽(yáng)光狀態(tài)sunshineState,可取值SHOW,MOVE。SHOW表示生命時(shí)間對(duì)其有效,MOVE表示生命時(shí)間對(duì)其無(wú)效。drawSelf():如果該陽(yáng)光還存活的狀態(tài)下,它處在SHOW狀態(tài)時(shí),判斷存活時(shí)間是否超過5s,如果超過,isAlive賦值為false,如果沒有不進(jìn)行操作。處在MOVE狀態(tài)時(shí),它的橫縱坐標(biāo)分別以xSpeed,ySpeed速度遞減,當(dāng)縱坐標(biāo)小于屏幕上邊界時(shí)
42、,陽(yáng)光值加50,并將isAlive賦值為false。需要說(shuō)明的是用戶點(diǎn)擊陽(yáng)光時(shí)它的狀態(tài)就被設(shè)置為MOVE,并計(jì)算它運(yùn)動(dòng)起點(diǎn)到終點(diǎn)的橫縱距離,分別用xDistance,yDistance表示,要在5幀后使它完成移動(dòng)就要將xSpeed,ySpeed分別設(shè)置為xDistance/5f,yDistance/5f。狀態(tài)圖如圖5.5所示。圖5.5 陽(yáng)光的狀態(tài)圖5.3.2 豌豆射手種植及射擊實(shí)現(xiàn)同太陽(yáng)花一樣定義其相關(guān)實(shí)體類SeedPea、EmplacePea、Pea、Bullet其中前三個(gè)類與太陽(yáng)花相似,這里不做描述。Bullet,子彈類,繼承自BaseModel,不需要實(shí)現(xiàn)已定義接口。xSpeed表示子彈
43、橫向移動(dòng)速度,初始化為5。在它的drawSelf()函數(shù)中,先畫出子彈后將它的橫坐標(biāo)加上xSpeed,這樣每一幀連接起來(lái)就會(huì)看到子彈以勻速向右移動(dòng),當(dāng)他超過屏幕右邊界時(shí),isAlive置為false。因?yàn)樽訌椥枰c僵尸發(fā)生碰撞,所以定義getModelWidth()方法獲取子彈圖片寬度以對(duì)碰撞進(jìn)行控制。5.3.3 生成僵尸的實(shí)現(xiàn)僵尸類Zombie繼承BaseModel,不需要實(shí)現(xiàn)接口。構(gòu)造方法參數(shù)需要傳遞生成所在位置坐標(biāo),還需要傳遞一個(gè)整型變量raceWay,它表示跑道,也就是前面分析提到的僵尸行進(jìn)路線,僵尸在做碰撞檢測(cè)時(shí)只需要檢測(cè)本跑道的子彈或者植物,不用其他跑道的事情,這也是劃分5條跑道的
44、好處。因?yàn)榻┦窃谶叢シ抛约旱膭?dòng)畫幀邊向屏幕左方運(yùn)動(dòng),所以在drawSelf()函數(shù)中不僅在繪制每一幀之后要把動(dòng)畫幀下標(biāo)加一,還要將它的橫坐標(biāo)減去僵尸前進(jìn)速度xSpeed,當(dāng)然每次動(dòng)畫幀加一后要對(duì)7取余,因?yàn)榻┦瑒?dòng)畫有7幀。為了對(duì)碰撞進(jìn)行處理也需要定義getModelWidth()來(lái)獲取僵尸圖片寬度。為了對(duì)生成僵尸進(jìn)行管理還需要定義ZombieManager類來(lái)控制僵尸的產(chǎn)生。為了控制每個(gè)一段時(shí)間產(chǎn)生一個(gè)僵尸定義長(zhǎng)整型變量lastBirthTime=0,在drawSelf()函數(shù)中判斷如果上次產(chǎn)生僵尸時(shí)刻到現(xiàn)在大于15s,則向Game類申請(qǐng)apply4AddZombie()在屏幕中產(chǎn)生僵尸。5
45、.3.4 游戲大管家定義Game類的draw()函數(shù),在其中先繪出背景圖片、種子欄,在游戲屏幕添加一個(gè)菜單點(diǎn)擊按鈕,作為游戲暫停功能。在游戲屏幕添加一個(gè)菜單點(diǎn)擊按鈕,作為游戲暫停功能。然后在MainSurfaceView類中定義Game對(duì)象并初始化,在myDraw(),onTouchEvent()中相應(yīng)狀態(tài)下調(diào)用Game類對(duì)象的draw(),onTouchEvent()函數(shù)。運(yùn)行后可得到游戲進(jìn)行中界面。 由于游戲是通過不斷繪制圖片進(jìn)行的,因此先畫與后畫必須分得非常清楚,不然導(dǎo)致非正常的覆蓋將影響游戲視覺效果。最后畫的元素在屏幕最上層,規(guī)定其為第一層,之后依次類推。在種植植物而拖動(dòng)種子時(shí),種子圖
46、片將隨著手指的移動(dòng)而移動(dòng),這個(gè)時(shí)候種子圖片應(yīng)該顯示在所有屏幕對(duì)象的最上邊,即它能夠覆蓋其他元素而不能被任何元素覆蓋,所以應(yīng)該為第一層,在繪圖函數(shù)中應(yīng)該最后畫。植物種子規(guī)定為第二層,陽(yáng)光規(guī)定為第三層,最后植物、僵尸、子彈為第四層。當(dāng)然還有游戲背景和種子欄,因?yàn)闆]有單獨(dú)為他們?cè)O(shè)計(jì)類,所以直接在函數(shù)中畫出。定義容器gameLayout1,gameLayout2,gameLayout3分別表示第一層、第二層、第三層容納的單位。用gameLayout4plant0,gameLayout4zombie0分別表示第四層第一條跑道容納的植物單位和僵尸單位。剩下的跑到依次類推。定義createElement()
47、方法為陽(yáng)光值Config.sunshineValue賦初值200,對(duì)各種容器初始化,并在該方法中新建SeedFlower、SeedPea類對(duì)象seedFlower、seedPea,將他們初始化到種子欄中相應(yīng)位置,用gameLayout2.add()添加到第二層。實(shí)現(xiàn)apply4EmplacePlant()方法。首先對(duì)MainSurface.sfh加鎖,防止意外訪問。程序是在不斷循環(huán)的,當(dāng)點(diǎn)擊植物種子后,有可能會(huì)創(chuàng)建若干個(gè)將要被種植的植物,所以要檢測(cè)gameLayout1.size()是否為0,如果為零判斷將要種植哪種植物,調(diào)用gameLayout1.add(new EmplaceXXX(loc
48、ationX, locationY)創(chuàng)建并添加到第一層。在draw()方法中遍歷gameLayout1,調(diào)用其中元素的drawSelf()方法。創(chuàng)建之后并不能將該對(duì)象擱置不管,要在用戶觸發(fā)ACTION_UP事件時(shí)做兩件工作。第一:將其isAlive屬性賦值為false并清理掉該對(duì)象。因此需要新定義removeEmplacePlant()方法以遍歷gameLayout1,如果其中有不需要的元素則將其添加到deadList容器中,之后再遍歷deadList將其銷毀。這時(shí)gameLayout1.size()值為零,為下一次種植做準(zhǔn)備。第二:調(diào)用apply4Plant()種植選取的植物。實(shí)現(xiàn)apply
49、4Plant()方法,要實(shí)現(xiàn)該方法需要做一些準(zhǔn)備工作。根據(jù)概要設(shè)計(jì)是要將交戰(zhàn)區(qū)劃分為45個(gè)格子,每個(gè)植物必須種植在格子中間,不能出現(xiàn)在其他地方。使用下面的代碼計(jì)算交戰(zhàn)區(qū)45個(gè)格子坐標(biāo)并保存。private void createElement() for (int i = 0; i 5; i+) for (int j = 0; j 9; j+) Config.plantPoints.put(i * 10 + j, new Point(j + 2)* Config.screenW / 11 - Config.screenW / 11 / 2,(i + 1) * Config.screenH / 6 - 10);if (j = 0) Config.raceWayYpointsi = (i + 1) * Config.screenH / 6- 10;外層循環(huán)用來(lái)控制跑道的
溫馨提示
- 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工智能深度學(xué)習(xí)案例分析題集
- 畜牧防疫與動(dòng)物養(yǎng)殖責(zé)任承擔(dān)協(xié)議
- 外包勞務(wù)承攬協(xié)議
- 某超市輻射源規(guī)定
- 我家的老物件老式鬧鐘作文(13篇)
- 2025年系列高效脫氧劑項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模板
- 專業(yè)服務(wù)公司與醫(yī)院合作協(xié)議
- 2025年消防安全知識(shí)培訓(xùn)實(shí)操應(yīng)用篇考試題庫(kù)消防巡查試題
- 綜合案例分析題2025年大學(xué)統(tǒng)計(jì)學(xué)期末考試題庫(kù)實(shí)戰(zhàn)解析與實(shí)戰(zhàn)
- 2025年溫室節(jié)能遮蔭保溫幕項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 旅游景區(qū)安全事故課件
- 中國(guó)心力衰竭診斷和治療指南2024解讀
- 《飼料添加劑學(xué)》課件
- 2025年長(zhǎng)江財(cái)產(chǎn)保險(xiǎn)股份有限公司招聘筆試參考題庫(kù)含答案解析
- (高清版)DB21∕T 2487-2015 中尺度對(duì)流天氣分析技術(shù)規(guī)范
- 公共設(shè)施環(huán)境保護(hù)管理方案
- 2024上海市招聘社區(qū)工作者考試題及參考答案
- 有限空間作業(yè)安全技術(shù)規(guī)范(DB3212T 1099-2022)
- 中華人民共和國(guó)史期末復(fù)習(xí)
- 2025年中電科太力通信科技限公司招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 蘇教版 五年級(jí) 數(shù)學(xué) 下冊(cè)《第1課時(shí) 因數(shù)和倍數(shù)》課件
評(píng)論
0/150
提交評(píng)論