?
游戲規(guī)則:
在桌面彈球游戲中,玩家通過(guò)控制一個(gè)可以左右移動(dòng)的擋板去阻止彈球落地。
當(dāng)彈球與擋板碰撞,發(fā)生反彈后,如果與磚塊碰撞,該磚塊就會(huì)被消除掉。注意其中有一些磚塊是有魔法的。
當(dāng)有魔法的磚塊被消除掉時(shí),就會(huì)有一個(gè)道具落下,道具有兩種,分別可以使擋板變長(zhǎng)和變短。
如果擋板接住了道具,魔法就會(huì)起效。
當(dāng)所有的磚塊都被消除掉后,玩家就勝出,如果彈球球落下時(shí)沒有被擋板接住,本輪游戲就失敗了。
?
?
在游戲中,有擋板、彈球、磚塊、道具這四種游戲?qū)ο螅u塊是固定不動(dòng)的,擋板的移動(dòng)是由玩家通過(guò)鍵盤控制的,彈球和道具也是運(yùn)動(dòng)的。這些游戲?qū)ο蠖加泄餐奶匦裕凶约旱奈恢茫?
x
與
y
坐標(biāo),有圖片屬性,有速度屬性。
?
BallComponent 作為 Brick (磚塊)類、 Magic (道具)類、 Stick (擋板)類、 Ball (彈球)類的父類,包含了上面提到的幾個(gè)共有的屬性。當(dāng)然,在 BallComponent 中至少要有一些獲取和設(shè)置屬性的方法,為了簡(jiǎn)單明了,圖中并沒有標(biāo)出。
?
Magic(道具)類(該類中有一個(gè)用于使道具功能實(shí)現(xiàn)的抽象方法,供子類實(shí)現(xiàn)),道具類的子類有LongMagic和ShortMagic,作用是使擋板的長(zhǎng)度變長(zhǎng)或者變短,由magicDo(Stick stick)來(lái)實(shí)現(xiàn)。
確定了游戲?qū)ο蟾黝惡螅€需要一個(gè)BallFrame類,一個(gè)畫板類(BallPanel),一個(gè)BallService類來(lái)處理與游戲相關(guān)的業(yè)務(wù)邏輯。
?
下面分別思考下Brick(磚塊)類、Stick(擋板)類、Magic(道具)類、Ball(彈球)類、LongMagic類、ShortMagic類該如何定義。
?
Brick(磚塊)類的屬性定義:
?
// 定義道具,1表示變長(zhǎng)道具,2表示變短道具 private Magic magic = null; public static final int MAGIC_LONG_TYPE = 1; public static final int MAGIC_SHORT_TYPE = 2; // 定義一個(gè)boolean變量標(biāo)記磚塊是否有效,如果無(wú)效就不繪制在畫板上 private boolean disable = false;
?Brick(磚塊)類的構(gòu)造方法:
public Brick(String path, int type, int x, int y) throws IOException { super(path); if (type == Brick.MAGIC_LONG_TYPE) { this.magic = new LongMagic("img/long.gif", x, y); } else if (type == Brick.MAGIC_SHORT_TYPE) { this.magic = new ShortMagic("img/short.gif", x, y); } if (this.magic != null) { this.magic.setX(x); this.magic.setY(y); } }
?
注意構(gòu)造方法的參數(shù)中,path指的是磚塊圖片地址;type指的是磚塊的類型,0表示普通磚塊,1表示有變長(zhǎng)魔法的磚塊,2表示有變短魔法的磚塊;x,y分別表示道具的x,y坐標(biāo)。
?
Stick(擋板)類的屬性定義:
// 定義檔板移動(dòng)的速度 public static final int SPEED = 20; // 定義檔板初始的長(zhǎng)度 private int preWidth = 0;
?
?Stick(擋板)類的構(gòu)造器:
/** * 有參數(shù)構(gòu)造器 * * @param panelWidth * int 畫板寬度 * @param panelHeight * int 畫板高度 * @param path * String 圖片路徑 */ public Stick(int panelWidth, int panelHeight, String path) throws IOException { // 調(diào)用父構(gòu)造器 super(panelWidth, panelHeight, path); // 設(shè)置y坐標(biāo) this.setY(panelHeight - super.getImage().getHeight(null)); // 設(shè)置原本的長(zhǎng)度 this.preWidth = super.getImage().getWidth(null); }
?
可以看到,利用構(gòu)造器,可以把擋板定位在畫板的底部。彈球類(Ball)的構(gòu)造器與擋板類(Stick)的構(gòu)造器很類似,彈球的初始狀態(tài)是正好在擋板的正上方。
?
Ball(彈球)類的屬性定義:
// 定義球的豎向速度 private int speedY = 10; // 定義彈球的橫向速度 private int speedX = 8; // 定義是否在運(yùn)動(dòng) private boolean started = false; // 定義是否結(jié)束運(yùn)動(dòng) private boolean stop = false;
?
Magic(道具)類,LongMagic類、ShortMagic類的定義沒有太大難度,關(guān)鍵是magicDo(Stick stick)的實(shí)現(xiàn)。
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
