最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

植物大戰(zhàn)僵尸一代畢業(yè)論文(5)

2019-08-26 09:45 作者:嘻哈宙帝  | 我要投稿

第5章 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)

5.1 搭建游戲基本框架

5.1.1 WELCOME(歡迎界面)類

這是游戲的歡迎界面類,此類定義了開始游戲按鈕的橫坐標(biāo)、縱坐標(biāo)等,用draw()函數(shù)來(lái)繪制歡迎界面的一些圖片按鈕和主界面的背景。設(shè)計(jì)中還用到了onTouchEvent()函數(shù)來(lái)回應(yīng)并控制玩家在圖片按鈕區(qū)域所觸發(fā)的ACTION_DOWN事件,其目的就是用來(lái)控制和顯示按鈕所按下的圖片。

在玩家觸發(fā)完成ACTION_UP事件后,按鈕圖片將會(huì)被改變?yōu)槲窗聪聽顟B(tài)并會(huì)通過MainSurfaceView.gameState = MainSurfaceView.GAME_MENU代碼將游戲轉(zhuǎn)到主菜單界面。

5.1.2 MENU(菜單)類

游戲菜單,用boolean類型定義按鈕是否按下狀態(tài),并初始化值全部為false。在主菜單界面設(shè)計(jì)中的布局繪制菜單選項(xiàng)涉及到的全部按鈕。

用ACTION_DOWN或者ACTION_MOVE來(lái)檢測(cè)每個(gè)按鈕的狀態(tài),(是否被按下),如果是被按下的,則會(huì)在draw()函數(shù)中繪制按鈕被按下狀態(tài)時(shí)的相對(duì)應(yīng)的圖片。然后會(huì)在ACTION_UP事件中會(huì)把按鈕的狀態(tài)重新修正并且游戲界面會(huì)跳轉(zhuǎn)到相應(yīng)的游戲狀態(tài),就拿“游戲幫助”來(lái)說,點(diǎn)擊“游戲幫助”后調(diào)用MainSurfaceView.gameState =

MainSurfaceView.GAME_HELP改變游戲狀態(tài)。如果點(diǎn)擊“退出”,則調(diào)用System.exit(0),系統(tǒng)退出游戲。

5.1.3 HELP(游戲幫助)類

Help類主要是給玩家提供相關(guān)幫助信息,把內(nèi)容繪制在一張圖片上,玩家需要幫助時(shí)可以打開此功能,該類通過把幫助圖片顯示在屏幕上,方便玩家查看。點(diǎn)擊屏幕即可觸發(fā)ACTION_UP事件,回到主菜單界面。

5.1.4 SELECT(游戲選項(xiàng))類

為玩家提供游戲選項(xiàng)的一個(gè)類。玩家點(diǎn)擊屏幕的不同游戲模式觸發(fā)ACTION_UP事件,控制玩家進(jìn)入不同的游戲。

接著在MainSurfaceView類中將游戲狀態(tài)gameState初始化為GAME_WELCOME,定義并初始化SELECT類,在myDraw()狀態(tài)下調(diào)用draw()函數(shù),在onTouchEvent()狀態(tài)調(diào)用onTouchEvent()函數(shù)。

5.2 游戲MODEL包

5.2.1 Plant接口

種植植物是按照坐標(biāo)來(lái)種植的,五條線路來(lái)顯示植物和僵尸的作戰(zhàn)區(qū),不能隨便選取,每條路線都有九個(gè)格子的位置可以用來(lái)種植植物,玩家只能在這些規(guī)定的格子內(nèi)種植植物,布局中,我們定義了54個(gè)這樣的格子,并且規(guī)定每個(gè)格子能且只能栽種一種植物,不可以種植多種,就算是同一種植物也不可以在同一個(gè)格子里面種植。每個(gè)格子都有一個(gè)屬于自己的編號(hào),起作用是為了記錄該區(qū)域是否已經(jīng)種植了植物。該接口是用來(lái)實(shí)現(xiàn)getMapIndex()方法。

5.2.2 BaseMadol(基本)類

在游戲中,無(wú)論是植物單位,僵尸單位或者種子選擇欄中的種子,他們都會(huì)有一些共同的方法或者屬性,就如他們的坐標(biāo),即這些圖片所在的位置。為了減少代碼的編寫量,也方便查看,在面向?qū)ο笾形彝ǔ?huì)將各個(gè)類的公共部分編寫成一個(gè)類,方便其他類的調(diào)用。所以在程序中建立了這所有的公共父類BaseMadol。

5.2.3 Config(變量)類

Config類是用來(lái)全局變量的,這些都是游戲中所需要的變量。為什么要這么做,因?yàn)殚_發(fā)過程中測(cè)試是必須的,為了能夠快速完成這個(gè)過程,要修改上述這些變量,當(dāng)不是設(shè)置成全局變量將可能浪費(fèi)大量時(shí)間做重復(fù)的修改操作

該類還定義了游戲中所有對(duì)象的圖片素材。普通類不能從圖片工廠中獲取圖片,普通類如果要使用圖片都會(huì)從構(gòu)造函數(shù)中傳遞進(jìn)去,如果以此方法使用的多了,這將使程序顯得混亂,不方便管理。

該類還定義了所有植物種植點(diǎn)。

5.3 游戲具體實(shí)現(xiàn)及相關(guān)的實(shí)體類

5.3.1 太陽(yáng)花的種植及其產(chǎn)生陽(yáng)光實(shí)現(xiàn)

太陽(yáng)花卡片我們用SunSeed類定義,它就是繼承了BaseMadol類,實(shí)現(xiàn)了TauchAble接口。除了定義其坐標(biāo)、是否存在的成員變量外,還定義了一個(gè)觸摸區(qū)域。它的成員變量及成員方法如圖5.1。

圖5.1 SeedFlower類成員變量及成員方法示意圖

SeedFlower():SeedFlower類的構(gòu)造函數(shù),在這里的屬性我們會(huì)將其初始化,我們isAlive默認(rèn)為true。

drawSelf():繪畫函數(shù),主要功能是實(shí)現(xiàn)能在各個(gè)位置下顯示種植的太陽(yáng)花種子。具體實(shí)現(xiàn)方法如下。

onTouch():對(duì)觸屏事件處理,在該函數(shù)中它會(huì)首先記錄玩家點(diǎn)擊的觸摸點(diǎn)坐標(biāo),檢測(cè)touchArea.contains(pointX,pointY) && Config.sunshineValue>=Config.flowerCost,如果成立,就會(huì)此坐標(biāo)顯示一個(gè)玩家所要種植的植物,這個(gè)功能用定義在Game類里的apply4EmplacePlant(int locationX,int locationY)函數(shù)來(lái)實(shí)現(xiàn)。該函數(shù)會(huì)檢測(cè)所要種植的植物并創(chuàng)建一個(gè)要被種植的植物對(duì)象。

EmplaceFlower類是玩家所選擇的并且將要被種植的太陽(yáng)花類,也是繼承自BaseMadol,實(shí)現(xiàn)了TauchAble接口。

touchArea:手指觸屏跟隨區(qū)域,根據(jù)構(gòu)造函數(shù)所接收到的參數(shù),為即將種植太陽(yáng)花大小的區(qū)域進(jìn)行初始化。

Flower類是玩家可以看到的顯示屏上已經(jīng)種植的太陽(yáng)花,也是繼承自BaseMadol,實(shí)現(xiàn)了Plant接口。不僅有從父類繼承來(lái)變量,它還有屬于自己新增成員變量:frameIndex和長(zhǎng)整型變量lastShineTime,他們用來(lái)表示太陽(yáng)花位圖數(shù)組下標(biāo),所在格子編號(hào)。如圖5.2。

圖5.2 Flower類成員變量及成員方法示意圖

drawSelf():繪圖函數(shù),繪制當(dāng)前幀的圖片。

Sunshine類,太陽(yáng)花所生產(chǎn)出來(lái)的陽(yáng)光值,每10s都會(huì)產(chǎn)生一個(gè)。此類只存在5s,在這段時(shí)間內(nèi),如果玩家點(diǎn)擊了陽(yáng)光,那么對(duì)應(yīng)的陽(yáng)光值就會(huì)得到增長(zhǎng),每個(gè)增加50,要是在這5s內(nèi)沒有點(diǎn)擊到,那么陽(yáng)光機(jī)會(huì)自動(dòng)消失。從上述設(shè)計(jì)可以知道陽(yáng)光有兩種狀態(tài),一種是顯示狀態(tài),另一種是待拾取狀態(tài)。

drawSelf():在陽(yáng)光存活狀態(tài)下,若它此時(shí)是SHOW狀態(tài),判斷陽(yáng)光存在時(shí)間是否已經(jīng)有5s,如果存在時(shí)間已經(jīng)過了5s,那么isAlive值就將被賦值為false,如果沒有的話,就不會(huì)進(jìn)行任何操作。在MOVE狀態(tài)下,此時(shí),陽(yáng)光的橫縱坐標(biāo)就會(huì)以xSpeed,ySpeed的速度遞減,當(dāng)?shù)竭_(dá)上邊邊界時(shí),即當(dāng)縱坐標(biāo)小于屏幕的邊界時(shí),此時(shí)顯示欄的陽(yáng)光值就會(huì)顯示增加50,并且isAlive就會(huì)被賦值為false。

當(dāng)玩家點(diǎn)擊到陽(yáng)光時(shí),此時(shí)它的狀態(tài)就會(huì)被設(shè)置為MOVE,并且記錄運(yùn)動(dòng)起點(diǎn)到終點(diǎn)的橫縱距離,分別用xDistance,yDistance表示,然后將xSpeed,ySpeed分別設(shè)置為xDistance/5f,yDistance/5f。

狀態(tài)圖如圖5.3所示。

圖5.3 陽(yáng)光的狀態(tài)圖

5.3.2 豌豆射手種植及射擊實(shí)現(xiàn)

根太陽(yáng)花一樣,我們也定義SeedPea、EmplacePea、Pea、Bullet,其中SeedPea、EmplacePea、Pea前三個(gè)類與太陽(yáng)花相似。

Bullet:炮彈類,也是繼承自BaseMadol。游戲中我們用xSpeed來(lái)表示炮彈在水平方向的移動(dòng)速度,其初始值為5。在它的drawSelf()函數(shù)中,炮彈被先畫出來(lái),接著給它的橫坐標(biāo)加上xSpeed,這樣,在我們看來(lái),炮彈就是在直線勻速運(yùn)動(dòng)的,當(dāng)炮彈越過右邊邊界時(shí),那么isAlive就會(huì)自動(dòng)設(shè)置為false。若炮彈與僵尸碰撞,我們用getModelWidth()方法來(lái)處理此事件。

5.3.3 生成僵尸的實(shí)現(xiàn)

Zombie類(僵尸類)繼承BaseMadol。構(gòu)造方法參數(shù)也會(huì)用到僵尸剛生成使得坐標(biāo),用raceWay來(lái)傳遞一個(gè)整型變量來(lái)表示跑道,簡(jiǎn)單的來(lái)說,就是僵尸進(jìn)攻的線路,在做碰撞檢測(cè)的時(shí)候,系統(tǒng)會(huì)檢測(cè)跑道上的炮彈和所種植的植物。由于僵尸是橫向向著屏幕的左邊移動(dòng),所以在drawSelf()函數(shù)中要在繪制每一幀之后再把動(dòng)畫幀下標(biāo)加一,然后它的橫坐標(biāo)還要減去僵尸前進(jìn)的速度xSpeed。

為了方便管理僵尸的生成,我們定義了一個(gè)ZombieManager類,此類會(huì)控制僵尸在15s隨機(jī)生成一類的僵尸。我們用以下方法來(lái)實(shí)現(xiàn)僵尸的生成:

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;

}

5.3.4 游戲管家

此游戲是通過不斷繪制圖片來(lái),因此必須非常清楚的劃分回吐的順序,不然會(huì)產(chǎn)生非正常的覆蓋將大大影響游戲的視覺效果。最后畫的元素覆蓋在屏幕最上層,并且將其規(guī)定為第一層,依次類推。

種植植物時(shí),我們?cè)O(shè)定種子圖片是隨著玩家的手指移動(dòng)而移動(dòng)的,這個(gè)時(shí)候種子圖片顯示在所有屏幕對(duì)象的最上邊,為第一層,最后畫這一層。植物的種子設(shè)定為第2層,陽(yáng)光則規(guī)定為第3層,然后將植物、僵尸、炮彈統(tǒng)一設(shè)定為第4層。定義容器gamesLayout1,gamesLayout2,gamesLayout3分別用來(lái)表示第1、2、3層容納的單位。用gamesLayout4plant0,gamesLayout4zombie0表示第4層第一條跑道植物和僵尸單位。剩下的跑到依次類推。定義createElement()為陽(yáng)光值Config.sunshineValue賦初值為100,初始化各種容器,并且新建會(huì)SeedFlower、SeedPea類對(duì)象seedFlower、seedPea,將他們初始化到種子欄中相應(yīng)位置,用gamesLayout2.add()添加到第二層。用如下代碼來(lái)設(shè)計(jì)植物與僵尸的跑道:

(以下代碼就不用突出功能強(qiáng)調(dià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.raceWayYpoints[i] = (i + 1) * Config.screenH / 6- 10;

}

}

}

}

以下代碼是用來(lái)記錄植物并添加植物到相應(yīng)的跑道的植物容器里面:

public void apply4Plant(int locationX, int locationY, BaseModel baseModel) {

??

for (Integer key : Config.plantPoints.keySet()) {

point = Config.plantPoints.get(key);

if ((Math.abs(locationX - point.x) < Config.screenW / 11 / 2)

&& (Math.abs(locationY - point.y) < Config.screenH / 6 / 2)) {

int raceWayIndex = 6;

for (int i = 0; i < Config.raceWayYpoints.length; i++) {

if (point.y == Config.raceWayYpoints[i]) {

raceWayIndex = i;

}

}

??

}

}

}

游戲的初始化:

/**

* 初始化游戲基本參數(shù)

* @param plantTypes

*/

public void initGameParas (ViewGroup root,int type, int[] plantTypes) {

// 獲取屏幕寬高

ScreenWidth = ((Activity) getContext()).getWindow().getWindowManager()

.getDefaultDisplay().getWeight();

ScreenHeight = ((Activity) getContext()).getWindow().getWindowManager()

.getDefaultDisplay().getHeight();

// 初始化植物、僵尸、子彈、卡片管理者

plantMgr = new PlantManager(getResources());

zoManager = new ZoobieManager(getResources());

bulletManager = new BulletManager(getResources());

CardManager(getContext(), root,plantTypes); cardManager = new

sunManager = new SunManager(getResources());

// 初始化游戲線程

gameDrawThread = new GameDrawThread(surfaceHolder, plantMgr, zoManager,

bulletManager, sunManager, choooseDayOrNight(type));

}

5.3.5 根據(jù)有無(wú)僵尸判斷是否射擊

根據(jù)需求,只有當(dāng)跑道有僵尸時(shí)豌豆射手才需要發(fā)射炮彈,當(dāng)該跑道還沒有生成或所有僵尸時(shí)豌豆射手將不會(huì)射擊,即不發(fā)射炮彈。在Pea類中,isShoot用來(lái)表示定義的一個(gè)布爾變量,其初始值設(shè)為false,定義其get、set方法,檢測(cè)isShoot值是否為true,true時(shí)調(diào)用shootBullet()函數(shù)。在Game類apply4AddZombie()中當(dāng)產(chǎn)生僵尸的時(shí)候,檢測(cè)該產(chǎn)生僵尸的跑道是否有豌豆射手存在,如果有,那么isShoot就被設(shè)置為true,如果沒有,那么依然為false。然而若是在產(chǎn)生僵尸時(shí)判斷是否有豌豆射手,每次都要對(duì)isShoot判斷。所以應(yīng)當(dāng)在豌豆射手發(fā)射炮彈時(shí)檢測(cè)是否有僵尸在跑道上,如果有僵尸則發(fā)射導(dǎo)彈,否則不發(fā)射。

5.3.6 僵尸碰到植物停止當(dāng)吃掉植物后繼續(xù)前進(jìn)

當(dāng)僵尸和植物相遇后就會(huì)停止前進(jìn),此時(shí),僵尸開始進(jìn)食植物,在此過程中,植物會(huì)抵抗3s,接著,僵尸還會(huì)繼續(xù)前進(jìn)。在Zombie類中用布爾變量isMove來(lái)定義僵尸的活動(dòng)狀態(tài),并初始化為true、僵尸碰撞植物后用變量eatTime(長(zhǎng)整型)記錄此時(shí)系統(tǒng)時(shí)間,并設(shè)置變量get(),set()屬性。在僵尸橫向移動(dòng)代碼上添加條件語(yǔ)句:只有isMove為true時(shí)僵尸才從右向左移動(dòng)。在Game類中當(dāng)碰撞函數(shù)檢測(cè)到僵尸與植物碰撞時(shí),若僵尸還處于移動(dòng)狀態(tài),則使其停止前進(jìn),將這刻系統(tǒng)時(shí)間用zombie.setEatTime(System.currentTimeMillis())記錄。當(dāng)僵尸與植物的接觸超過3s時(shí),系統(tǒng)將植物isAlive賦值為false,此時(shí)植物即被吃掉消失,然后僵尸會(huì)繼續(xù)進(jìn)攻,向左屏幕前進(jìn)。


植物大戰(zhàn)僵尸一代畢業(yè)論文(5)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
胶南市| 沁源县| 定南县| 定襄县| 同心县| 河东区| 积石山| 九寨沟县| 平罗县| 泸州市| 百色市| 浦东新区| 闽清县| 资兴市| 乌审旗| 新余市| 浪卡子县| 阜阳市| 巴彦淖尔市| 武汉市| 泊头市| 洞头县| 通海县| 驻马店市| 康乐县| 彭山县| 扎囊县| 武功县| 濉溪县| 镇坪县| 平果县| 鹤壁市| 长岭县| 寿阳县| 蒲城县| 枞阳县| 高青县| 绥江县| 汾阳市| 当阳市| 疏附县|