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

正文內(nèi)容

畢業(yè)論文-基于android手機操作系統(tǒng)的植物大戰(zhàn)僵尸游戲設(shè)計-資料下載頁

2025-01-12 11:16本頁面
  

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