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

正文內(nèi)容

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

2025-01-12 11:16本頁(yè)面
  

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