freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于android植物大戰(zhàn)僵尸所有專業(yè)-資料下載頁

2025-05-12 13:27本頁面

【導(dǎo)讀】手機(jī)游戲,顧名思義就是指在手機(jī)上運(yùn)行的游戲軟件。目前用來編寫手機(jī)程序使用。最多的是Java語言。隨著科技的發(fā)展,手機(jī)的硬件更新速度越來越快,功能也越來越?,F(xiàn)在的手機(jī)游戲具有很強(qiáng)的娛樂性和交互性的復(fù)雜形態(tài)。安卓版本的游戲有三大優(yōu)勢。一方面是其穩(wěn)定性,現(xiàn)在已有公認(rèn)。最穩(wěn)定版本的操作系統(tǒng)——Gingerbread。另一方面是程序員技術(shù)入門快,特別是對有一。定java語言基礎(chǔ)的人來說。主流的手機(jī)操作系統(tǒng)。對象,復(fù)雜的對象可以由比較簡單的對象以某種方式組合而成。把對象劃分為對象類,為他們定義數(shù)據(jù)與方法。建立子類與父類的結(jié)構(gòu)關(guān)系。的游戲,在要求程序執(zhí)行效率很高時(shí),例如對速度要求很高,還可以使用雙緩沖來顯示。手機(jī)游戲行業(yè)概述····································&

  

【正文】 到主菜單界面,之后用戶根據(jù)需要選擇各種功能 后轉(zhuǎn)到相應(yīng)界面,不同界面之間的跳轉(zhuǎn)關(guān)系如 圖 。 圖 界面跳轉(zhuǎn)關(guān)系圖 交互設(shè)計(jì) 該游戲 為 Android中文版,因此界面語言選擇使用中文。每個(gè)頁面都添加有 onTouch()函數(shù)和 onKeyDown()函數(shù)以響應(yīng)用戶觸屏和點(diǎn)擊按鍵事件,其功能都是退出本頁面,在歡迎、主菜單界面點(diǎn)擊 退出按鈕則是退出游戲,這么設(shè)置主要是為了程序方便退出。主菜單 實(shí)現(xiàn)了程序功能選擇功能,其實(shí)它就相當(dāng)于實(shí)現(xiàn)了程序?qū)Ш焦δ?。主菜單界面設(shè)計(jì)如圖 。 游戲界面有一個(gè)種子收集欄,點(diǎn)擊該區(qū)域相應(yīng) 種子之后將其拖動(dòng)到種植區(qū)域就能將植物種植,種植區(qū)分為五個(gè)橫著的跑到,每行 都有僵尸進(jìn)攻。游戲界面設(shè)計(jì)如圖 。 視覺設(shè)計(jì) 游戲采用 綠色為主色調(diào), 這是大部分植物的顏色,色彩與內(nèi)容符合。角 色 造型使用畢業(yè)設(shè)計(jì)(論文) 11 卡通設(shè)計(jì)表現(xiàn)形式顯得滑稽、可愛。 圖 主菜單界面設(shè)計(jì)圖 圖 游戲界面設(shè)計(jì)圖 畢業(yè)設(shè)計(jì)(論文) 12 第 5 章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn) 植物大戰(zhàn)僵尸游戲采用面向?qū)ο蟮姆椒ㄟM(jìn)行設(shè)計(jì),在對象設(shè)計(jì)過程中 將程序中各種事物都看成是對象,復(fù)雜的對象可以由比 較簡單的對象以某種方式組合而成。把對象劃分為對象類,為他們定義數(shù)據(jù)與方法。建立子類與父類的結(jié)構(gòu)關(guān)系 。 將需要使用的圖片準(zhǔn)備好,需要修改的用 Fireworks 修改, 最后使用 Java代碼將該游戲各個(gè)部分描述出來。 搭建游戲基本骨架 SurfaceView 框架 在 Android 系統(tǒng)中創(chuàng)建植物大戰(zhàn)僵尸游戲的實(shí)現(xiàn)方法,需要使用到 SurfaceView 游戲框架 ,它 主要是用來開發(fā)復(fù)雜的游戲,在要求程序執(zhí)行 效率很高時(shí),例如對速度要求很高的游戲,可以使用雙緩沖來顯示。游戲中 的背景、人物都繪制在一個(gè)畫布上 , 而Surfaceview 可以 直接訪問一個(gè)畫布。 因?yàn)?系統(tǒng)默認(rèn)建立豎屏項(xiàng)目,所以 首先 在 配置文件的Activity里添加代碼 android:screenOrientation=landscape將屏幕設(shè)置為橫屏顯示。 定義一個(gè)類 ―MainSurfaceView‖ ,此類繼承 SurfaceView ,除此之外還要實(shí)現(xiàn) 和 Runnable 接口。 在其中定義了一個(gè) SurfaceHolder 類的實(shí)例,該類可以為提供 SurfaceView 的大小,格式等,并且主要用于監(jiān)聽 SurfaceView 的狀態(tài)。我們是通過 SurfaceHolder 來控制SurfaceView 的,使用 lockCanvas()函數(shù) 來獲取到 SurfaceView 的 Canvas 對象,再通過在Canvas 上繪制內(nèi)容來修改 SurfaceView 中的數(shù)據(jù)。為了防止 SurfaceView 在繪制過程中被修改、摧毀等發(fā)生的狀態(tài)改變,要用 lockCanvas()函數(shù)對 Canvas 畫布進(jìn)行加鎖,在繪制完成后還要使用 unlockCanvasAndPostt()函數(shù)來解鎖畫布 和提交。因此繪畫函數(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()語句實(shí)現(xiàn)在不同游戲狀態(tài)下的游戲繪圖。 onTouchEvent()函數(shù)同樣這么處理。 在游戲中,基本不會(huì)等用戶每次觸發(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í)間到底要多長呢?無疑這必須要根據(jù)人眼視覺暫留的特性來確定。比如一個(gè)視頻,如果幀數(shù)達(dá)到24幀,那么這個(gè)視頻播放起來人眼是感覺不到卡頓的。 24幀意思就是每秒播放 24張圖片。為了讓程序達(dá)到每秒繪制將近 24 次,讓程序每次開始繪制到下一次開始繪制的時(shí)間保持在 50ms 之內(nèi) ,一秒繪制 20 次,這已經(jīng)能夠滿足該游戲的需求了。 畢業(yè)設(shè)計(jì)(論文) 13 接下來修改 MainActivity 類, onCreate(Bundle savedInstanceState) 函數(shù),用setContentView(new MainSurfaceView(this))讓其顯示自定義的 SurfaceView 視圖,使用requestWindowFeature() 隱 去 標(biāo) 題 欄 , 再 使 用getWindow().setFlags()函數(shù)隱去狀態(tài)欄。 定義 init()函數(shù)將 Config類中定義的各種 位圖初始化。 WELCOME類 這是定義的歡迎界面的類 ,定義了開始游戲按鈕的橫縱坐標(biāo)等,它的 draw()函數(shù)繪制了歡迎界面背景和圖片按鈕。 onTouchEvent()函數(shù)的功能是玩家在圖片按鈕區(qū)域觸發(fā)ACTION_DOWN事件后,控制顯示表示按鈕被按下的圖片。 當(dāng)玩家在按鈕區(qū)域觸發(fā) ACTION_UP 事件后,按鈕圖片顯示為未按下狀態(tài)并使用 = 代碼將游戲轉(zhuǎn)到主菜單 界面 。 MENU類 游戲主菜單,其中 用 boolean類型 定義了所有按鈕 是否按下 的狀態(tài) ,并將它們?nèi)砍跏蓟癁?false。將 ―常規(guī)模式 ‖、 ―夜晚模式 ‖、 ―無盡模式 ‖、 ―退出 ‖等按鈕按照主菜單界面設(shè)計(jì)中的布局繪制好。 在 ACTION_DOWN 或者 ACTION_MOVE 事件中檢測每個(gè)按鈕的狀態(tài)(是否被按下),如果是,則在 draw()函數(shù)中繪制被按下狀態(tài)的相應(yīng)圖片按鈕。在 ACTION_UP 事件中將被釋放按鈕的狀態(tài)修正并轉(zhuǎn)到相應(yīng)的游戲狀態(tài) , 比如 點(diǎn)擊 ―幫助 ‖后調(diào)用 = 改變游戲狀態(tài)。如果點(diǎn)擊―退出 ‖,調(diào)用 (0)直接退出游戲。 OPTION類 實(shí)現(xiàn)游戲聲音設(shè)置功能。繪制完背景之后再繪制未按下狀態(tài)的聲音開關(guān)按鈕。玩家在按鈕區(qū)域點(diǎn)擊一次該按鈕, onTouchEvent()函數(shù)將變量 取反,如果該值為真則播放背景音樂,如果為假則停止播放背景音樂,并調(diào)用()函數(shù)為下一次開啟背景音樂做準(zhǔn)備。完成這些動(dòng)作之后將游戲 轉(zhuǎn)到主菜單。 HELP 類 Help 類是給玩家提供幫助信息,把幫助內(nèi)容寫在一張圖片上,玩家需要幫助時(shí)打開該功能,該類把幫助圖片繪制在屏幕上,玩家可查看幫助??赐曛簏c(diǎn)擊屏幕觸發(fā)ACTION_UP 事件,游戲轉(zhuǎn)到主菜單界面。 SELECT 類 該類為玩家提供選擇關(guān)卡功能。玩家點(diǎn)擊屏幕并在相應(yīng)關(guān)卡位置觸發(fā) ACTION_UP事件后,程序判斷現(xiàn)在已通過最高關(guān)卡 是否大于或者等于用戶選擇的畢業(yè)設(shè)計(jì)(論文) 14 關(guān)卡,如果成立,則將游戲設(shè)置為玩家選擇關(guān)卡,否則彈出消息提示用戶 “ 該關(guān)卡還沒解鎖 ” 。 接著 在 MainSurfaceView 類中將游戲狀態(tài) gameState 初始化為 GAME_WELCOME,定義上述類的對象并初始化,在 myDraw(), onTouchEvent()函數(shù)相應(yīng)的游戲狀態(tài)下分別調(diào)用這些對象的 draw()和 onTouchEvent()函數(shù)。 到此游戲基本骨架搭建完成,類圖如圖 。 圖 游戲框架 相關(guān) 類圖 游戲 MODEL包 TouchAble接口 Android 手機(jī)可見的按鍵非常少,很多除了開機(jī)鍵,音量鍵就只有功能鍵、主菜單鍵、返回鍵,玩家在玩游戲時(shí)都 是使用手指觸屏進(jìn)行操作,所以每個(gè)操作對象都會(huì)響應(yīng)觸摸事件。為了滿足程序的這個(gè)要求,定義了 TouchAble 接口方便有要求的類實(shí)現(xiàn)。 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è)格子畢業(yè)設(shè)計(jì)(論文) 15 里也不能種植兩個(gè)。給這個(gè)格子編號(hào)用來記錄是否種植過植 物并且記錄每個(gè)植物種植的位置。所以定義該接口以實(shí)現(xiàn) getMapIndex()方法。 BaseModel類 在游戲中,不管是植物單位,僵尸單位還是種子欄中的種子圖片,他們都有一些共同的屬性或者方法,比如他們的坐標(biāo),即這些圖片應(yīng)該出現(xiàn)的位置,還有所有對象想要在設(shè)備屏幕中顯示出來都要調(diào)用一個(gè)繪畫方法來把自己畫出來。根據(jù)面向?qū)ο蟮睦^承性(這個(gè)性質(zhì)無疑給程序帶來了許多突出優(yōu)點(diǎn)),為了減少冗余信息,應(yīng)當(dāng)抽取相似類的公共屬性和公共服務(wù)。所以要為程序中一部分類建立父類 BaseModel。 Config類 雖然說要盡量避免使用全局變量,不過現(xiàn)在的設(shè)備性能越來越高,和以前老機(jī)器不可同日而語,所以我認(rèn)為這個(gè)問題不是現(xiàn)在最關(guān)注的問題。 Config類就是存放游戲中需要使用的各種全局變量的。比如屏幕的寬度和高度,產(chǎn)生陽關(guān)、僵尸、子彈的時(shí)間等。為什么要這么做是由原因的,因?yàn)殚_發(fā)過程中需要跑測試,為了快速完成這個(gè)過程,要修改上述這些變量,如果沒有設(shè)置全局變量將浪費(fèi)大量時(shí)間做重復(fù)的修改操作。 該類還定義了游戲中各種對象所使用的圖片素材。普通類中是不能從圖片工廠中獲得圖片,普通類需要使用圖片只能從構(gòu)造函數(shù)中傳遞進(jìn)去,如果 在每個(gè)使用上述普通類的地方都去定義圖片素材并加載圖片,這將使程序顯得相當(dāng)混亂,不好管理。 該類還定義了所有適合種植植物點(diǎn)的集合,并將交戰(zhàn)區(qū)域定義為五條路線并準(zhǔn)備對它們的豎坐標(biāo)進(jìn)行記錄。 游戲 具體實(shí)現(xiàn)及相關(guān)的實(shí)體類 太陽花 種植及產(chǎn)生 陽光實(shí)現(xiàn) SeedFlower 類為種子欄中的 太陽花 卡片, 繼承自 BaseModel,實(shí)現(xiàn)了 TouchAble 接口。除了定義其顯示的坐標(biāo)、是否存在的 成員變量 外,還定義了一個(gè)矩形的觸摸區(qū)域。其成員變量 及成員方法 如圖 。 圖 SeedFlower 類成員變量及 成員方法示意圖 畢業(yè)設(shè)計(jì)(論文) 16 SeedFlower(): SeedFlower 類的 構(gòu)造函數(shù) ,其中 將所有屬性初始化,需要特別說明的是 isAlive 默認(rèn)為 true。 drawSelf():繪畫函數(shù),主要實(shí)現(xiàn)太陽花種子圖片在各種情況下的顯示情況。具體實(shí)現(xiàn)描述如下 。 在 能夠顯示該種子卡片的情況下,如果當(dāng)前陽光值 小于種植太陽花所需要的陽光值 ,將畫筆 Alpha 值設(shè)置為 100, 畫太陽花。為了不影響其他對象使用畫筆還需要在畫完太陽花后將畫筆 Alpha 值還原為 255。 onTouch():觸屏處理函數(shù) , 在 該 函數(shù)中首先記錄捕捉的觸摸點(diǎn)坐標(biāo),檢測(pointX,pointY) amp。amp。 =,如果成立則在該坐標(biāo)顯示一個(gè)即將被種植的植物,這個(gè)功能需要使用定義在 Game 類里的apply4EmplacePlant(int locationX,int locationY)函數(shù)來實(shí)現(xiàn)。 該函數(shù)會(huì) 檢測即將種植哪種植物并 新建一個(gè)即將被種植的植物對象。 EmplaceFlower 類是將被 種植的太陽花類,同樣繼承自 BaseModel,實(shí)現(xiàn) TouchAble接口。 touchArea:手指觸屏移動(dòng)跟隨區(qū)域, 根據(jù)構(gòu)造函數(shù)接收的參數(shù)初始化為即將種植太陽花大小的區(qū)域。 onTouch():觸屏函數(shù), 觸發(fā) ACTON_MOVE 事件時(shí),對該類的橫縱坐標(biāo)進(jìn)行修正,使觸摸點(diǎn)在圖片中心,并使 touchArea 隨著觸摸點(diǎn)的移動(dòng)而移動(dòng)。響應(yīng) ACTION_UP 事件時(shí),將 isAlive 變量賦值為 false,在移除該對象后調(diào)用 Game 類中 apply4Plant(int locationX,int locationY,BaseModel baseModel)函數(shù)種植植物。在該函數(shù)會(huì)檢測種植哪種植物,這里種植太陽花,所以會(huì)新建 Flower 類對象。 Flower 類是屏幕上種植的太陽花, 繼承自 BaseModel,實(shí)現(xiàn)了 Plant接口。 除了具有從父類繼承來的變量,還具有自己的新整型成員變量: frameIndex, mapIndex和長整型變量 lastShineTime,他們分別表示太陽花位圖數(shù)組下標(biāo),所在格子編號(hào),上一次產(chǎn)生陽光的時(shí)刻。 如圖 。 圖 Flower 類成員變量及成員方法示意圖 畢業(yè)設(shè)計(jì)(論文) 17 drawSelf():繪圖函數(shù) , 繪制當(dāng)前幀的圖片,當(dāng)前幀自加一后對 8 取余 ,當(dāng)現(xiàn)在時(shí)刻減去上一次產(chǎn)生陽光時(shí)刻的時(shí)間差大于系統(tǒng)產(chǎn)生陽光時(shí)間 ,將上次產(chǎn)生陽光時(shí)刻賦值為現(xiàn)在時(shí)刻,調(diào)用 Game 類中 produceSunshine(int locationX,int locationY)函數(shù)來產(chǎn)生有光,在該函數(shù)中新建 Sunshine 類對象。 種植植物流程如圖 。 圖 種植植物流程圖 Sunshine 類是太陽花每隔 10s 生產(chǎn)出來的 陽光。 陽光產(chǎn)生之后生存 5s,如果在這 5s之內(nèi)點(diǎn)擊了陽光,陽光會(huì)移動(dòng)到陽光 值記錄處,并將陽光值增加 50,如果超過 5s 沒有點(diǎn)擊,它會(huì)自動(dòng)消失。 為了防止陽光在移動(dòng)時(shí)沒有到達(dá)終點(diǎn)就消失,它存在的時(shí)間只在顯示狀態(tài)有效。其實(shí)這種情況是存在的,比如玩家點(diǎn)擊了某個(gè)生存 的陽光,理想的效果是它會(huì)從改點(diǎn)移動(dòng)到終點(diǎn)然后消失,但是因?yàn)樗纳鏁r(shí)間只有 5s,在這僅剩的 里它還沒有來得及移動(dòng)到終點(diǎn)就消失,這種情況是不允許的。從上述設(shè)計(jì)可以看出陽光有兩種狀態(tài),一種是顯示狀態(tài),另一種是移動(dòng)狀態(tài)。 該類中定義了枚舉類型的陽光狀態(tài) sunshineState,可取值 SHOW, MOVE。 SHOW表示生命 時(shí)間對其有效, MOVE表示生命時(shí)間對其無效。 drawSelf(): 如果該陽光還存活的狀態(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í),陽光值加 50,并將 isAlive 賦值為 false。 需要說明的是用戶點(diǎn)擊陽光時(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)圖如圖 。 畢業(yè)設(shè)計(jì)(論文) 18 圖 陽光的狀態(tài)圖 豌豆射手種植及射擊實(shí)現(xiàn) 同太陽花一樣定義其 相關(guān)實(shí)體類 SeedPea、 EmplacePea、 Pea、 Bullet 其中前三個(gè)類與太陽花相似,這里不做描述。 Bullet,子彈類,繼承自 BaseModel,不需要實(shí)現(xiàn)已定義接口。 xSpeed 表示子彈橫向移動(dòng)速度,初始化為 5。在它的 drawSelf()函數(shù)中,先畫出子彈后將它的橫坐標(biāo)加上xSpeed,這樣 每一幀連接起來就會(huì)看到子彈以勻速向右移動(dòng),當(dāng)他超過屏幕右邊界時(shí),isAlive 置為 false。因?yàn)樽訌椥枰c僵尸發(fā)生碰撞,所以定義 getModelWidth()方法獲取子彈圖片寬度以對碰撞進(jìn)行控制。 生成僵尸的實(shí)現(xiàn) 僵尸類 Zombie 繼承 BaseModel, 不需要實(shí)現(xiàn)接口。構(gòu)造方法參數(shù)需要傳遞生成所在位置坐標(biāo),還需要傳遞一個(gè)整型變量 raceWay,它表示跑道,也就是前面分析提到的僵尸行進(jìn)路線,僵尸在做碰撞檢測時(shí)只需要檢測本跑道的子彈或者植物,不用其他跑道的事情,這也是劃分 5條跑道的好處。因?yàn)榻┦?是在邊播放自己的動(dòng)畫幀邊向屏幕左方運(yùn)動(dòng),所以在 drawSelf()函數(shù)中不僅在繪制每一幀之后要把動(dòng)畫幀下標(biāo)加一,還要將它的橫坐標(biāo)減去僵尸前進(jìn)速度 xSpeed,當(dāng)然每次動(dòng)畫幀加一后要對 7 取余,因?yàn)榻┦瑒?dòng)畫有 7幀。 為了對碰撞進(jìn)行處理也需要定義 getModelWidth()來獲取僵尸圖片寬度。 為了對生成僵尸進(jìn)行管理還需要定義 ZombieManager 類來控制僵尸的產(chǎn)生。為了控制每個(gè)一段時(shí)間產(chǎn)生一個(gè)僵尸定義長整型變量 lastBirthTime=0,在 drawSelf()函數(shù)中判斷如果 上次產(chǎn)生僵尸時(shí)刻到現(xiàn)在大于 15s,則向 Game 類申請 apply4AddZombie()在屏幕中產(chǎn)生僵尸。 游戲大管家 定義 Game 類的 draw()函數(shù),在其中先繪出背景圖片 、種子欄, 在游戲屏幕添加一個(gè)菜單點(diǎn)擊按鈕,作為游戲暫停功能。在游戲屏幕添加一個(gè)菜單點(diǎn)擊按鈕,作為游戲暫停功能。 然后在 MainSurfaceView 類中定義 Game 對象并初始化, 在 myDraw(),onTouchEvent()中相應(yīng)狀態(tài)下調(diào)用 Game 類對象的 draw(), onTouchEvent()函數(shù) 。 運(yùn)行后可得到游戲進(jìn)行中界面。 由于游戲是通過不 斷繪制圖片進(jìn)行的,因此先畫與后畫必須分得非常清楚,不然導(dǎo)致非正常的覆蓋將影響游戲視覺效果。 最 后 畫的元素在 屏幕 最 上 層 , 規(guī)定其為第一層 ,畢業(yè)設(shè)計(jì)(論文) 19 之后依次類推。 在種植植物而拖動(dòng)種子時(shí),種子圖片將隨著手指的移動(dòng)而移動(dòng), 這個(gè)時(shí)候種子圖片應(yīng)該顯示在所有屏幕對象的最上邊,即它能夠覆蓋其他元素而不能被任何元素覆蓋, 所以應(yīng)該為第一層,在繪圖函數(shù)中應(yīng) 該最后畫。植物種子規(guī)定為第二層,陽光規(guī)定為第三層,最后植物、僵尸、子彈為第四層。當(dāng)然還有游戲背景和種子欄,因?yàn)闆]有單獨(dú)為他們設(shè)計(jì)類,所以直接在函數(shù)中畫出。 定義容器 gameLayout1, gameLayout2, gameLayout3分別表示第一層、第二層、第三層 容納的單位 。用 gameLayout4plant0 ,gameLayout4zombie0 分別表示第四層第一條跑道 容納的植物單位和僵尸單位。 剩下的跑到依次類推。 定義 createElement()方法為陽光值 賦初值 200,對各種容器初始化,并在該方法中新建 SeedFlower、 SeedPea 類對象 seedFlower、 seedPea,將他們初始化到種子欄中相應(yīng)位置,用 ()添加到第二層 。 實(shí)現(xiàn) apply4EmplacePlant()方法 。 首先對 加鎖,防止意外訪問。程序是在不斷循環(huán)的,當(dāng)點(diǎn)擊植物種子后,有可能會(huì)創(chuàng)建若干個(gè)將要被種植的植物,所以要檢測 ()是否為 0,如果為零 判斷將要種植哪種植物,調(diào)用(new EmplaceXXX(locationX, locationY))創(chuàng)建并添加到第一層。在 draw()方法中遍歷 gameLayout1,調(diào)用其中元素的 drawSelf()方法。 創(chuàng)建之后并 不能將該對象擱置不管,要在用戶觸發(fā) ACTION_UP 事件時(shí)做兩件工作 。 第一:將其 isAlive 屬性賦值為 false 并清理掉該對象 。 因此 需要新 定義 removeEmplacePlant()方法 以 遍歷gameLayout1, 如果其中有不需要的元素 則 將其添加到 deadList 容器中 , 之后再遍歷deadList將其銷毀。這時(shí) ()值 為零 , 為下一次種植做準(zhǔn)備。第二:調(diào)用apply4Plant()種植選取的植物。 實(shí)現(xiàn) apply4Plant()方法, 要實(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++) { (i * 10 + j, new Point((j + 2)* / 11 / 11 / 2,(i + 1) * / 6 10))。 if (j == 0) { [i] = (i + 1) * / 6 10。 } } } } 外層循環(huán)用來控制跑道的行數(shù),內(nèi)層循環(huán)用來控制跑道的列數(shù)。認(rèn)為游戲背景左側(cè)非交戰(zhàn)區(qū)占 倍格子的寬度,右側(cè)非交戰(zhàn)區(qū)大約占 個(gè)格子的寬度,上冊非交戰(zhàn)區(qū)高度畢業(yè)設(shè)計(jì)(論文) 20 占一個(gè)單元格的高度,因此一個(gè)格子的寬度和高度大約分別占整個(gè)游戲背景寬度的十一分之一,高度的六分之一。上面代碼 i*10+j 表示第幾個(gè)格子, j+2 表示忽略前兩列,之后再減去 個(gè)格子的寬度就就是 i 行每個(gè)格子的橫坐標(biāo)。 i+1 表示忽略一個(gè)單元格的高度, / 6 – 10中的減去 10是對縱坐標(biāo)進(jìn)行的修正。 if語句記錄跑道的縱坐標(biāo)。 在添加植物方法中先遍歷 plantPoints 集合,找到離 EplaceXXX類對象最近的種植點(diǎn) 并計(jì)算該點(diǎn)在那個(gè)跑道,確定跑道之后才能將要種植的植物添加到相應(yīng)跑道的植物容器中。該功能代碼如下: public void apply4Plant(int locationX, int locationY, BaseModel baseModel) { ?? for (Integer key : ()) { point = (key)。 if (((locationX ) / 11 / 2) amp。amp。 ((locationY ) / 6 / 2)) { int raceWayIndex = 6。 for (int i = 0。 i 。 i++) { if ( == [i]) { raceWayIndex = i。 } } ?? } } } 將要被種植植物圖片左上角坐標(biāo)橫坐標(biāo)與 plantPoints 集合中每個(gè)點(diǎn)橫坐標(biāo)相減,如果他們的絕對值小于半個(gè)格子的寬度并且這兩個(gè)點(diǎn)縱坐標(biāo)之差的絕對值小于半個(gè)格子高度,那么此時(shí)遍歷到的點(diǎn)就是植物最合適種植的點(diǎn), 接 下來遍歷 raceWayYpoints 數(shù)組尋找該合適點(diǎn)在第幾個(gè)跑道。 在添加植物時(shí)還要判斷該合適種植點(diǎn)是否已經(jīng)存在植物,如果有植物時(shí)放棄種植。isExistPlant(int key,int raceWayIndex)方法實(shí)現(xiàn)了該功能。 根據(jù)得到的跑道數(shù),對該跑道植物集合進(jìn)行遍歷,如果是 Plant 接口的子類,如果在集合中某個(gè)植物的 key 與合適種植點(diǎn)的 key值一樣則這個(gè)點(diǎn)已經(jīng)存在植物,現(xiàn)在不能再這里種植。如果遍歷完所有對象都沒有找到則返回一個(gè) true表示可以種植。 讓屏幕出現(xiàn)僵尸,在 Game 類中的處理比添加植物簡 單多了。在 Game 類中新建ZombieManager對象 zombieManager并初始化后在, draw()方法中調(diào)用該對象的的 drawSelf()方法,最后只需要實(shí)現(xiàn) apply4AddZombie()方法。取隨機(jī)數(shù) (), (int) (() * 10) % 5 處理之后賦值給新定義的局部變量 raceWay,根據(jù) raceWay,新建僵尸添加進(jìn)相應(yīng)跑道中僵尸容器后就實(shí)現(xiàn)了生成僵尸的方法。 下面是其實(shí)現(xiàn)代碼: 畢業(yè)設(shè)計(jì)(論文) 21 public boolean isExistPlant(int key, int raceWayIndex) { switch (raceWayIndex) { case 0: for (BaseModel model : gameLayout4plant0) { if (model instanceof Plant) { if (key == ((Plant) model).getMapIndex()) return false。 } } break。 ?? } return true。 } 根據(jù)有無僵尸判斷是否射擊 現(xiàn) 在要實(shí)現(xiàn)只有當(dāng)跑道有僵尸時(shí)豌豆射手才發(fā)射炮彈,當(dāng)該跑道的所有僵尸死亡或者還沒有產(chǎn)生僵尸時(shí)豌豆射手停止射擊處于休息狀態(tài)即不發(fā)射炮彈。首先在 Pea類中定義布爾變量 isShoot,初始化為 false,定義其 get與 set函數(shù),在該類中只有當(dāng) isShoot為 true時(shí)才調(diào)用 shootBullet()函數(shù)。在大管家 Game類 apply4AddZombie()中當(dāng)產(chǎn)生僵時(shí)遍歷該產(chǎn)生僵尸的跑道是否有豌豆射手存在,如果有就將豌豆射手 isShoot設(shè)置為 true,若果沒有不做處理。運(yùn)行程序之后發(fā)現(xiàn)若果先種植豌豆射手再產(chǎn)生僵尸 一切正常沒有問題,如果該跑
點(diǎn)擊復(fù)制文檔內(nèi)容
畢業(yè)設(shè)計(jì)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1