?
游戲規則:
在桌面彈球游戲中,玩家通過控制一個可以左右移動的擋板去阻止彈球落地。
當彈球與擋板碰撞,發生反彈后,如果與磚塊碰撞,該磚塊就會被消除掉。注意其中有一些磚塊是有魔法的。
當有魔法的磚塊被消除掉時,就會有一個道具落下,道具有兩種,分別可以使擋板變長和變短。
如果擋板接住了道具,魔法就會起效。
當所有的磚塊都被消除掉后,玩家就勝出,如果彈球球落下時沒有被擋板接住,本輪游戲就失敗了。
?
?
在游戲中,有擋板、彈球、磚塊、道具這四種游戲對象,磚塊是固定不動的,擋板的移動是由玩家通過鍵盤控制的,彈球和道具也是運動的。這些游戲對象都有共同的特性,有自己的位置,即
x
與
y
坐標,有圖片屬性,有速度屬性。
?
BallComponent 作為 Brick (磚塊)類、 Magic (道具)類、 Stick (擋板)類、 Ball (彈球)類的父類,包含了上面提到的幾個共有的屬性。當然,在 BallComponent 中至少要有一些獲取和設置屬性的方法,為了簡單明了,圖中并沒有標出。
?
Magic(道具)類(該類中有一個用于使道具功能實現的抽象方法,供子類實現),道具類的子類有LongMagic和ShortMagic,作用是使擋板的長度變長或者變短,由magicDo(Stick stick)來實現。
確定了游戲對象各類后,還需要一個BallFrame類,一個畫板類(BallPanel),一個BallService類來處理與游戲相關的業務邏輯。
?
下面分別思考下Brick(磚塊)類、Stick(擋板)類、Magic(道具)類、Ball(彈球)類、LongMagic類、ShortMagic類該如何定義。
?
Brick(磚塊)類的屬性定義:
?
// 定義道具,1表示變長道具,2表示變短道具 private Magic magic = null; public static final int MAGIC_LONG_TYPE = 1; public static final int MAGIC_SHORT_TYPE = 2; // 定義一個boolean變量標記磚塊是否有效,如果無效就不繪制在畫板上 private boolean disable = false;
?Brick(磚塊)類的構造方法:
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); } }
?
注意構造方法的參數中,path指的是磚塊圖片地址;type指的是磚塊的類型,0表示普通磚塊,1表示有變長魔法的磚塊,2表示有變短魔法的磚塊;x,y分別表示道具的x,y坐標。
?
Stick(擋板)類的屬性定義:
// 定義檔板移動的速度 public static final int SPEED = 20; // 定義檔板初始的長度 private int preWidth = 0;
?
?Stick(擋板)類的構造器:
/** * 有參數構造器 * * @param panelWidth * int 畫板寬度 * @param panelHeight * int 畫板高度 * @param path * String 圖片路徑 */ public Stick(int panelWidth, int panelHeight, String path) throws IOException { // 調用父構造器 super(panelWidth, panelHeight, path); // 設置y坐標 this.setY(panelHeight - super.getImage().getHeight(null)); // 設置原本的長度 this.preWidth = super.getImage().getWidth(null); }
?
可以看到,利用構造器,可以把擋板定位在畫板的底部。彈球類(Ball)的構造器與擋板類(Stick)的構造器很類似,彈球的初始狀態是正好在擋板的正上方。
?
Ball(彈球)類的屬性定義:
// 定義球的豎向速度 private int speedY = 10; // 定義彈球的橫向速度 private int speedX = 8; // 定義是否在運動 private boolean started = false; // 定義是否結束運動 private boolean stop = false;
?
Magic(道具)類,LongMagic類、ShortMagic類的定義沒有太大難度,關鍵是magicDo(Stick stick)的實現。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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