疯狂java实战演义 弹球游戏代码

  1 package org.crazyit.ball;

  2 

  3 import java.awt.Image;

  4 import java.io.File;

  5 import javax.imageio.ImageIO;

  6 import java.io.IOException;

  7 

  8 /**

  9  * 小球对象

 10  * 

 11  * @author yangenxiong [email protected]

 12  * @author Kelvin Mak [email protected]

 13  * @version  1.0

 14  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

 15  * <br>Copyright (C), 2009-2010, yangenxiong

 16  * <br>This program is protected by copyright laws.

 17  */

 18 public class Ball extends BallComponent {

 19     // 定义球的竖向速度

 20     private int speedY = 10;

 21     // 定义弹球的横向速度

 22     private int speedX = 8;

 23     // 定义是否在运动

 24     private boolean started = false;

 25     // 定义是否结束运动

 26     private boolean stop = false;

 27 

 28     /**

 29      * m 有参数构造器

 30      * 

 31      * @param panelWidth

 32      *            int 画板宽度

 33      * @param panelHeight

 34      *            int 画板高度

 35      * @param offset

 36      *            int 位移

 37      * @param path

 38      *            String 图片路径

 39      */

 40     public Ball(int panelWidth, int panelHeight, int offset, String path)

 41             throws IOException {

 42         // 调用父构造器

 43         super(panelWidth, panelHeight, path);

 44         // 设置y坐标

 45         this.setY(panelHeight - super.getImage().getHeight(null) - offset);

 46     }

 47 

 48     /**

 49      * 设置横向速度

 50      * 

 51      * @param speed

 52      *            int 速度

 53      * @return void

 54      */

 55     public void setSpeedX(int speed) {

 56         this.speedX = speed;

 57     }

 58 

 59     /**

 60      * 设置竖向速度

 61      * 

 62      * @param speed

 63      *            int 速度

 64      * @return void

 65      */

 66     public void setSpeedY(int speed) {

 67         this.speedY = speed;

 68     }

 69 

 70     /**

 71      * 设置是否在运动

 72      * 

 73      * @param b

 74      *            boolean

 75      * @return void

 76      */

 77     public void setStarted(boolean b) {

 78         this.started = b;

 79     }

 80 

 81     /**

 82      * 设置是否结束运动

 83      * 

 84      * @param b

 85      *            boolean

 86      * @return void

 87      */

 88     public void setStop(boolean b) {

 89         this.stop = b;

 90     }

 91 

 92     /**

 93      * 返回横向速度

 94      * 

 95      * @return int 速度

 96      */

 97     public int getSpeedX() {

 98         return this.speedX;

 99     }

100 

101     /**

102      * 返回竖向速度

103      * 

104      * @return int 速度

105      */

106     public int getSpeedY() {

107         return this.speedY;

108     }

109 

110     /**

111      * 是否在运动

112      * 

113      * @return boolean 是否在运动

114      */

115     public boolean isStarted() {

116         return this.started;

117     }

118 

119     /**

120      * 是否已经结束运动

121      * 

122      * @return boolean 是否已经结束运动

123      */

124     public boolean isStop() {

125         return this.stop;

126     }

127 

128 }
Ball
  1 package org.crazyit.ball;

  2 

  3 import java.awt.Image;

  4 import java.io.File;

  5 import javax.imageio.ImageIO;

  6 import java.io.IOException;

  7 

  8 /**

  9  * 桌面弹球游戏相关组件的父类

 10  * 

 11  * @author yangenxiong [email protected]

 12  * @author Kelvin Mak [email protected]

 13  * @version  1.0

 14  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

 15  * <br>Copyright (C), 2009-2010, yangenxiong

 16  * <br>This program is protected by copyright laws.

 17  */

 18 public class BallComponent {

 19     // 设置x坐标

 20     private int x = -1;

 21     // 设置y坐标

 22     private int y = -1;

 23     // 设置图片

 24     private Image image = null;

 25     // 设置图片速度

 26     private int speed = 5;

 27 

 28     /**

 29      * 构造器

 30      * 

 31      * @param path

 32      *            String 图片路径

 33      */

 34     public BallComponent(String path) throws IOException {

 35         super();

 36         this.image = ImageIO.read(new File(path));

 37     }

 38 

 39     /**

 40      * 构造器

 41      * 

 42      * @param panelWidth

 43      *            int 画板宽度

 44      * @param panelHeight

 45      *            int 画板高度

 46      * @param path

 47      *            String 图片路径

 48      */

 49     public BallComponent(int panelWidth, int panelHeight, String path)

 50             throws IOException {

 51         super();

 52         // 读取图片

 53         this.image = ImageIO.read(new File(path));

 54         // 设置x坐标

 55         this.x = (int) ((panelWidth - image.getWidth(null)) / 2);

 56     }

 57 

 58     /**

 59      * 构造器

 60      * 

 61      * @param x

 62      *            int 图像的x坐标

 63      * @param y

 64      *            int 图像的y坐标

 65      * @param path

 66      *            String 图片路径

 67      */

 68     public BallComponent(String path, int x, int y) throws IOException {

 69         super();

 70         // 读取图片

 71         this.image = ImageIO.read(new File(path));

 72         this.x = x;

 73         this.y = y;

 74     }

 75 

 76     /**

 77      * 获取x坐标

 78      * 

 79      * @return int x坐标

 80      */

 81     public int getX() {

 82         return this.x;

 83     }

 84 

 85     /**

 86      * 获取y坐标

 87      * 

 88      * @return int y坐标

 89      */

 90     public int getY() {

 91         return this.y;

 92     }

 93 

 94     /**

 95      * 获取图片速度

 96      * 

 97      * @return int 图片速度

 98      */

 99     public int getSpeed() {

100         return this.speed;

101     }

102 

103     /**

104      * 设置x坐标

105      * 

106      * @param x

107      *            int x坐标

108      * @return void

109      */

110     public void setX(int x) {

111         this.x = x;

112     }

113 

114     /**

115      * 设置y坐标

116      * 

117      * @param y

118      *            int y坐标

119      * @return void

120      */

121     public void setY(int y) {

122         this.y = y;

123     }

124 

125     /**

126      * 返回图片

127      * 

128      * @return Image 图片

129      */

130     public Image getImage() {

131         return this.image;

132     }

133 }
BallComponent
  1 package org.crazyit.ball;

  2 

  3 import javax.swing.JFrame;

  4 import javax.swing.JPanel;

  5 import javax.swing.Timer;

  6 import java.awt.Dimension;

  7 import java.awt.Image;

  8 import java.awt.Graphics;

  9 import java.awt.Color;

 10 import java.awt.event.KeyAdapter;

 11 import java.awt.event.KeyListener;

 12 import java.awt.event.KeyEvent;

 13 import java.awt.event.ActionListener;

 14 import java.awt.event.ActionEvent;

 15 import java.io.IOException;

 16 

 17 /**

 18  * 游戏界面

 19  * 

 20  * @author yangenxiong [email protected]

 21  * @author Kelvin Mak [email protected]

 22  * @version  1.0

 23  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

 24  * <br>Copyright (C), 2009-2010, yangenxiong

 25  * <br>This program is protected by copyright laws.

 26  */

 27 public class BallFrame extends JFrame {

 28     // 定义JPanel的宽度

 29     private final int BALLPANEL_WIDTH = 307;

 30     // 定义JPanel的高度

 31     private final int BALLPANEL_HEIGHT = 400;

 32     // 定义画板

 33     private BallPanel ballPanel = null;

 34     // 定义档板

 35     // private Image stick = null;

 36     // 设置档板x坐标

 37     private int stickX = -1;

 38     // 创建一个BallService实例

 39     private BallService service = null;

 40     // 定义一个timer

 41     Timer timer = null;

 42 

 43     /**

 44      * 默认构造器

 45      */

 46     public BallFrame() throws IOException {

 47         super();

 48         // 初始化

 49         initialize();

 50     }

 51 

 52     /**

 53      * 初始化界面

 54      * 

 55      * @return void

 56      */

 57     public void initialize() throws IOException {

 58         // 设置窗口的标题

 59         this.setTitle("弹球");

 60         // 设置为不可改变大小

 61         this.setResizable(false);

 62         // 设置背景为黑色

 63         this.setBackground(Color.BLACK);

 64         // 获取画板

 65         ballPanel = getBallPanel();

 66         // 创建BallService实例

 67         service = new BallService(this, BALLPANEL_WIDTH, BALLPANEL_HEIGHT);

 68 

 69         // 定义每0.1秒执行一次监听器

 70         ActionListener task = new ActionListener() {

 71             public void actionPerformed(ActionEvent e) {

 72                 // 开始改变位置

 73                 service.run();

 74                 // 刷新画板

 75                 ballPanel.repaint();

 76             }

 77         };

 78         // 如果timer不为空

 79         if (timer != null) {

 80             // 重新开始timer

 81             timer.restart();

 82         } else {

 83             // 新建一个timer

 84             timer = new Timer(100, task);

 85             // 开始timer

 86             timer.start();

 87         }

 88 

 89         this.add(ballPanel);

 90         // 增加事件监听器

 91         KeyListener[] klarr = this.getKeyListeners();

 92         if (klarr.length == 0) {

 93             // 定义键盘监听适配器

 94             KeyListener keyAdapter = new KeyAdapter() {

 95                 public void keyPressed(KeyEvent ke) {

 96                     // 改变档板的坐标

 97                     service.setStickPos(ke);

 98                 }

 99             };

100             this.addKeyListener(keyAdapter);

101         }

102     }

103 

104     /**

105      * 获取画板

106      * 

107      * @return BallPanel 返回BallPanle

108      */

109     public BallPanel getBallPanel() {

110 

111         if (ballPanel == null) {

112             // 新建一个画板

113             ballPanel = new BallPanel();

114             // 设置画板的大小

115             ballPanel.setPreferredSize(new Dimension(BALLPANEL_WIDTH,

116                     BALLPANEL_HEIGHT));

117         }

118         return ballPanel;

119     }

120 

121     // 定义一个JPanel内部类来完成画图功能

122     public class BallPanel extends JPanel {

123         /**

124          * 重写void paint( Graphics g )方法

125          * 

126          * @param g

127          *            Graphics

128          * @return void

129          */

130         public void paint(Graphics g) {

131             // 画图

132             service.draw(g);

133         }

134     }

135 

136 }
BallFrame
 1 package org.crazyit.ball;

 2 

 3 import java.io.IOException;

 4 

 5 import javax.swing.JFrame;

 6 

 7 /**

 8  * 游戏入口类

 9  * 

10  * @author yangenxiong [email protected]

11  * @author Kelvin Mak [email protected]

12  * @version  1.0

13  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

14  * <br>Copyright (C), 2009-2010, yangenxiong

15  * <br>This program is protected by copyright laws.

16  */

17 public class BallGame {

18     /**

19      * 开始游戏

20      * 

21      * @return void

22      */

23     public static void main(String[] args) throws IOException {

24         BallFrame ballFrame = new BallFrame();

25         ballFrame.pack();

26         ballFrame.setVisible(true);

27         ballFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

28     }

29 }
BallGame
  1 package org.crazyit.ball;

  2 

  3 import java.awt.event.KeyEvent;

  4 import java.awt.Image;

  5 import java.awt.Graphics;

  6 import java.io.IOException;

  7 

  8 /**

  9  * 处理游戏逻辑的对象

 10  * 

 11  * @author yangenxiong [email protected]

 12  * @author Kelvin Mak [email protected]

 13  * @version  1.0

 14  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

 15  * <br>Copyright (C), 2009-2010, yangenxiong

 16  * <br>This program is protected by copyright laws.

 17  */

 18 public class BallService {

 19     // 定义一个Stick(档板)

 20     private Stick stick = null;

 21     // 定义一个弹球

 22     private Ball ball = null;

 23     // 定义一个游戏结束图片

 24     private BallComponent gameOver = null;

 25     // 定义一个赢了游戏的图片

 26     private BallComponent won = null;

 27     // 定义一个砖块图片数组

 28     private Brick[][] bricks = null;

 29     private int width;

 30     private int height;

 31     BallFrame ballFrame = null;

 32 

 33     /**

 34      * 私有空构造器

 35      */

 36     private BallService() {

 37         super();

 38     }

 39 

 40     /**

 41      * 

 42      * @param frame

 43      *            JFrame JFrame实例

 44      * @param width

 45      *            int 宽

 46      * @param height

 47      *            int 高

 48      * @return BallService

 49      */

 50     public BallService(BallFrame frame, int width, int height)

 51             throws IOException {

 52         // 初始化变量

 53         this.width = width;

 54         this.height = height;

 55         this.ballFrame = frame;

 56         // 创建一个Stick(档板)实例

 57         stick = new Stick(width, height, "img/stick.jpg");

 58         // 创建一个弹球的实例

 59         ball = new Ball(width, height, stick.getImage().getHeight(null),

 60                 "img/ball.gif");

 61         // 游戏结束图片

 62         gameOver = new BallComponent("img/over.gif");

 63         // 赢图片

 64         won = new BallComponent("img/win.gif");

 65         // 砖块图片数组

 66         bricks = createBrickArr("img/brick.gif", 11, 6);

 67     }

 68 

 69     /**

 70      * run

 71      * 

 72      * @return void

 73      */

 74     public void run() {

 75         // 弹球坐标改变

 76         setBallPos();

 77         // 道具坐标改改变

 78         setMagicPos();

 79     }

 80 

 81     /**

 82      * 设置档板图片的位置

 83      * 

 84      * @param ke

 85      *            KeyEvent 键盘事件

 86      * @return void

 87      */

 88     public void setStickPos(KeyEvent ke) {

 89         // 把弹球的运动状态设为true

 90         ball.setStarted(true);

 91         // 如果是左方向键

 92         if (ke.getKeyCode() == KeyEvent.VK_LEFT) {

 93             if (stick.getX() - stick.SPEED > 0) {

 94                 // x坐标向左移动

 95                 stick.setX(stick.getX() - stick.SPEED);

 96             }

 97         }

 98         // 如果是右方向键

 99         if (ke.getKeyCode() == KeyEvent.VK_RIGHT) {

100             if (stick.getX() + stick.SPEED < width - stick.getPreWidth()) {

101                 // x坐标向右移动

102                 stick.setX(stick.getX() + stick.SPEED);

103                 // ballFrame.getBallGame().reStart( ballFrame );

104             }

105         }

106         // 如果是F2键

107         if (ke.getKeyCode() == KeyEvent.VK_F2) {

108             // 初始化ballFrame

109             try {

110                 ballFrame.initialize();

111             } catch (IOException e) {

112                 System.out.println(e.getMessage());

113             }

114         }

115     }

116 

117     /**

118      * 设置小球图片的位置

119      * 

120      * @return void

121      */

122     public void setBallPos() {

123         // 正数的数度

124         int absSpeedX = Math.abs(ball.getSpeedX());

125         int absSpeedY = Math.abs(ball.getSpeedY());

126         // 如果游戏已经开始而且没有结束

127         if (ball.isStarted()) {

128             // 如果小球碰到左边界

129             if (ball.getX() - absSpeedX < 0) {

130                 // 重新设置x坐标

131                 ball.setX(ball.getImage().getWidth(null));

132                 // 把x方向的速度设为反方向

133                 ball.setSpeedX(-ball.getSpeedX());

134             }

135             // 如果小球碰到右边界

136             if (ball.getX() + absSpeedX > width

137                     - ball.getImage().getWidth(null)) {

138                 // 重新设置x坐标

139                 ball.setX(width - ball.getImage().getWidth(null) * 2);

140                 // 把x方向的速度设为反方向

141                 ball.setSpeedX(-ball.getSpeedX());

142             }

143             // 如果小球碰到上边界

144             if (ball.getY() - absSpeedY < 0) {

145                 // 重新设置y坐标

146                 ball.setY(ball.getImage().getWidth(null));

147                 // 把y方向的速度设为反方向

148                 ball.setSpeedY(-ball.getSpeedY());

149             }

150             // 如果小球碰到下边界

151             if (ball.getY() + absSpeedY > height

152                     - stick.getImage().getHeight(null)) {

153                 // 如果小球与档板有碰撞

154                 if (isHitStick(ball)) {

155                     // 重新设置y坐标

156                     ball.setY(height - ball.getImage().getHeight(null) * 2);

157                     // 把y方向的速度设为反方向

158                     ball.setSpeedY(-ball.getSpeedY());

159                 }

160             }

161             // 与砖块碰撞后的运动

162             for (int i = bricks.length - 1; i > -1; i--) {

163                 for (int j = bricks[i].length - 1; j > -1; j--) {

164                     // 如果小球与砖块有碰撞

165                     if (isHitBrick(bricks[i][j])) {

166                         if (ball.getSpeedY() > 0) {

167                             ball.setSpeedY(-ball.getSpeedY());

168                         }

169                     }

170                 }

171             }

172             // 结束游戏

173             if (ball.getY() > height) {

174                 ball.setStop(true);

175             }

176 

177             // 设置x坐标

178             ball.setX(ball.getX() - (int) (Math.random() * 2)

179                     - ball.getSpeedX());

180             // 设置y坐标

181             ball.setY(ball.getY() - (int) (Math.random() * 2)

182                     - ball.getSpeedY());

183         }

184     }

185 

186     /**

187      * 小球与砖块是否有碰撞

188      * 

189      * @return boolean

190      */

191     public boolean isHitBrick(Brick brick) {

192         if (brick.isDisable()) {

193             return false;

194         }

195         // ball的圆心x坐标

196         double ballX = ball.getX() + ball.getImage().getWidth(null) / 2;

197         // ball的圆心y坐标

198         double ballY = ball.getY() + ball.getImage().getHeight(null) / 2;

199         // brick的中心x坐标

200         double brickX = brick.getX() + brick.getImage().getWidth(null) / 2;

201         // brick的中心y坐标

202         double brickY = brick.getY() + brick.getImage().getHeight(null) / 2;

203         // 两个坐标点的距离

204         double distance = Math.sqrt(Math.pow(ballX - brickX, 2)

205                 + Math.pow(ballY - brickY, 2));

206         // 如果两个图形重叠,返回true;

207         if (distance < (ball.getImage().getWidth(null) + brick.getImage()

208                 .getWidth(null)) / 2) {

209             // 使brick无效

210             brick.setDisable(true);

211             return true;

212 

213         }

214         return false;

215     }

216 

217     /**

218      * BallComponent是否与档板有碰撞

219      * 

220      * @param image

221      *            BallComponent 图像

222      * @return boolean

223      */

224     public boolean isHitStick(BallComponent bc) {

225         // 获取图片对象

226         Image tempImage = bc.getImage();

227         // 如果与档板有碰撞

228         if (bc.getX() + tempImage.getWidth(null) > stick.getX()

229                 && bc.getX() < stick.getX() + stick.getPreWidth()

230                 && bc.getY() + tempImage.getHeight(null) > stick.getY()) {

231             return true;

232         }

233         return false;

234     }

235 

236     /**

237      * 设置道具的位置

238      * 

239      * @return void

240      */

241     public void setMagicPos() {

242         for (int i = 0; i < bricks.length; i++) {

243             for (int j = 0; j < bricks[i].length; j++) {

244                 // 获取magic

245                 Magic magic = bricks[i][j].getMagic();

246                 if (magic != null) {

247                     // 如果这个brick的状态是无效的

248                     if (bricks[i][j].isDisable() && magic.getY() < height) {

249                         // 设置magic的y坐标向下增加

250                         magic.setY(magic.getY() + magic.getSpeed());

251                         // 设置档板的宽度

252                         setStickWidth(magic);

253 

254                     }

255                 }

256             }

257         }

258     }

259 

260     /**

261      * 设置档板的长度

262      * 

263      * @param magic

264      *            Magic 道具

265      * @return void

266      */

267     public void setStickWidth(Magic magic) {

268         if (isHitStick(magic)) {

269             // 道具的作用

270             magic.magicDo(stick);

271         }

272     }

273 

274     /**

275      * 判断是否赢了

276      * 

277      * @return boolean

278      */

279     public boolean isWon() {

280         // 如果消了全部砖块,则为赢

281         for (int i = 0; i < bricks.length; i++) {

282             for (int j = 0; j < bricks[i].length; j++) {

283                 if (!bricks[i][j].isDisable()) {

284                     return false;

285                 }

286             }

287         }

288         return true;

289     }

290 

291     /**

292      * 创建一个类型为Brick的数组

293      * 

294      * @param path

295      *            String 图像路径

296      * @param xSize

297      *            int

298      * @param ySize

299      *            int

300      * @return Brick[][]

301      */

302     public Brick[][] createBrickArr(String path, int xSize, int ySize)

303             throws IOException {

304         // 创建一个Brick[][]

305         Brick[][] bricks = new Brick[xSize][ySize];

306         int x = 0;

307         int y = 0;

308         int random = 0;

309         int imageSize = 28;

310         boolean isDisable = false;

311         // 迭代初始化数组

312         for (int i = 0; i < xSize; i++) {

313             for (int j = 0; j < ySize; j++) {

314                 // 创建一个新的砖块

315                 random = (int) (Math.random() * 3);

316                 x = i * imageSize;

317                 y = j * imageSize;

318                 // 一定机率没有砖块

319                 isDisable = Math.random() > 0.8 ? true : false;

320                 if (isDisable) {

321                     random = 0;

322                 }

323                 Brick brick = new Brick(path, random, x, y);

324                 brick.setDisable(isDisable);

325                 // 设置x坐标

326                 brick.setX(x);

327                 // 设置y坐标

328                 brick.setY(y);

329                 bricks[i][j] = brick;

330             }

331         }

332         return bricks;

333     }

334 

335     /**

336      * 画图

337      * 

338      * @param g

339      *            Graphics 用来画图的对象

340      * @return void

341      */

342     public void draw(Graphics g) {

343         // 如果赢了

344         if (isWon()) {

345             // 绘制赢的图片

346             g.drawImage(won.getImage(), won.getX(), won.getY(), width,

347                     height - 10, null);

348         } else if (ball.isStop()) {

349             // 绘制游戏结束图像

350             g.drawImage(gameOver.getImage(), gameOver.getX(), gameOver.getY(),

351                     width, height - 10, null);

352         } else {

353             // 清除原来的图像

354             g.clearRect(0, 0, width, height);

355             // 绘制档板图像

356             g.drawImage(stick.getImage(), stick.getX(), stick.getY(), stick

357                     .getPreWidth(), stick.getImage().getHeight(null), null);

358             // 绘制弹球图像

359             g.drawImage(ball.getImage(), ball.getX(), ball.getY(), null);

360             // 迭代绘制砖块图像

361             for (int i = 0; i < bricks.length; i++) {

362                 for (int j = 0; j < bricks[i].length; j++) {

363                     BallComponent magic = bricks[i][j].getMagic();

364                     // 如果这个砖块图像对像是有效的

365                     if (!bricks[i][j].isDisable()) {

366                         // 里面的数字1为砖块图像间的间隙

367                         g.drawImage(bricks[i][j].getImage(), bricks[i][j]

368                                 .getX(), bricks[i][j].getY(), bricks[i][j]

369                                 .getImage().getWidth(null) - 1, bricks[i][j]

370                                 .getImage().getHeight(null) - 1, null);

371                     } else if (magic != null && magic.getY() < height) {

372                         g.drawImage(magic.getImage(), magic.getX(), magic

373                                 .getY(), null);

374                     }

375                 }

376             }

377         }

378     }

379 }
BallService
 1 package org.crazyit.ball;

 2 

 3 import java.awt.Image;

 4 import java.io.IOException;

 5 

 6 /**

 7  * 砖块类

 8  * 

 9  * @author yangenxiong [email protected]

10  * @author Kelvin Mak [email protected]

11  * @version  1.0

12  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

13  * <br>Copyright (C), 2009-2010, yangenxiong

14  * <br>This program is protected by copyright laws.

15  */

16 public class Brick extends BallComponent {

17 

18     // 定义道具

19     private Magic magic = null;

20     // 定义一个boolean变量设置本类是否有效

21     private boolean disable = false;

22     public static final int MAGIC_LONG_TYPE = 1;

23     public static final int MAGIC_SHORT_TYPE = 2;

24 

25     /**

26      * 构造器

27      * 

28      * @return void

29      */

30     public Brick(String path, int type, int x, int y) throws IOException {

31         super(path);

32         if (type == Brick.MAGIC_LONG_TYPE) {

33             this.magic = new LongMagic("img/long.gif", x, y);

34         } else if (type == Brick.MAGIC_SHORT_TYPE) {

35             this.magic = new ShortMagic("img/short.gif", x, y);

36         }

37         if (this.magic != null) {

38             this.magic.setX(x);

39             this.magic.setY(y);

40         }

41     }

42 

43     /**

44      * 设置本类有没有效

45      * 

46      * @param disable

47      *            boolean

48      * @return void

49      */

50     public void setDisable(boolean disable) {

51         this.disable = disable;

52     }

53 

54     /**

55      * 查看本类有没有效

56      * 

57      * @return boolean 是否有效

58      */

59     public boolean isDisable() {

60         return this.disable;

61     }

62 

63     /**

64      * 获取道具

65      * 

66      * @return String magic

67      */

68     public Magic getMagic() {

69         return this.magic;

70     }

71 

72     /**

73      * 设置道具

74      * 

75      * @return String magic

76      */

77     public void setMagic(Magic magic) {

78         this.magic = magic;

79     }

80 }
Brick
 1 package org.crazyit.ball;

 2 

 3 import java.io.IOException;

 4 

 5 /**

 6  * 道具对象

 7  * 

 8  * @author yangenxiong [email protected]

 9  * @author Kelvin Mak [email protected]

10  * @version  1.0

11  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

12  * <br>Copyright (C), 2009-2010, yangenxiong

13  * <br>This program is protected by copyright laws.

14  */

15 public abstract class Magic extends BallComponent {

16     /**

17      * 提供给子类调用的构造器

18      * 

19      * @param path

20      *            String 文件路径

21      * @param x

22      *            int x坐标

23      * @param y

24      *            int y坐标

25      */

26     public Magic(String path, int x, int y) throws IOException {

27         super(path, x, y);

28     }

29 

30     /**

31      * 道具的功能

32      * 

33      * @param stitck

34      *            Stick

35      * @return void

36      */

37     public abstract void magicDo(Stick stick);

38 }
Magic

 

 1 package org.crazyit.ball;

 2 

 3 import java.io.IOException;

 4 

 5 /**

 6  * 使挡板变长的道具

 7  * 

 8  * @author yangenxiong [email protected]

 9  * @author Kelvin Mak [email protected]

10  * @version  1.0

11  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

12  * <br>Copyright (C), 2009-2010, yangenxiong

13  * <br>This program is protected by copyright laws.

14  */

15 public class LongMagic extends Magic {

16     /**

17      * 构造器

18      * 

19      * @param path

20      *            String 文件路径

21      * @param x

22      *            int x坐标

23      * @param y

24      *            int y坐标

25      */

26     public LongMagic(String path, int x, int y) throws IOException {

27         super(path, x, y);

28     }

29 

30     /**

31      * 道具的功能 : 档板变长

32      * 

33      * @param stitck

34      *            Stick

35      * @return void

36      */

37     public void magicDo(Stick stick) {

38         double imageWidth = stick.getImage().getWidth(null);

39         // 如果档板没有变长过

40         if (stick.getPreWidth() <= imageWidth) {

41             // 将档板的长度改为双倍

42             stick.setPreWidth((int) (stick.getPreWidth() * 2));

43         }

44     }

45 }
LongMagic
 1 package org.crazyit.ball;

 2 

 3 import java.io.IOException;

 4 

 5 /**

 6  * 使挡板变短的道具

 7  * 

 8  * @author yangenxiong [email protected]

 9  * @author Kelvin Mak [email protected]

10  * @version  1.0

11  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

12  * <br>Copyright (C), 2009-2010, yangenxiong

13  * <br>This program is protected by copyright laws.

14  */

15 public class ShortMagic extends Magic {

16     /**

17      * 构造器

18      * 

19      * @param path

20      *            String 文件路径

21      * @param x

22      *            int x坐标

23      * @param y

24      *            int y坐标

25      */

26     public ShortMagic(String path, int x, int y) throws IOException {

27         super(path, x, y);

28     }

29 

30     /**

31      * 道具的功能 : 档板变短

32      * 

33      * @param stitck

34      *            Stick

35      * @return void

36      */

37     public void magicDo(Stick stick) {

38         double imageWidth = stick.getImage().getWidth(null);

39         // 如果档板没有变短过

40         if (stick.getPreWidth() >= imageWidth) {

41             // 将档板的宽度改为一半

42             stick.setPreWidth((int) (stick.getPreWidth() * 0.5));

43         }

44     }

45 }
ShortMagic
 1 package org.crazyit.ball;

 2 

 3 import java.io.IOException;

 4 

 5 /**

 6  * 挡板类

 7  * 

 8  * @author yangenxiong [email protected]

 9  * @author Kelvin Mak [email protected]

10  * @version  1.0

11  * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>

12  * <br>Copyright (C), 2009-2010, yangenxiong

13  * <br>This program is protected by copyright laws.

14  */

15 public class Stick extends BallComponent {

16     // 定义档板移动的速度

17     public static final int SPEED = 20;

18     // 定义档板初始的长度

19     private int preWidth = 0;

20 

21     /**

22      * 有参数构造器

23      * 

24      * @param panelWidth

25      *            int 画板宽度

26      * @param panelHeight

27      *            int 画板高度

28      * @param path

29      *            String 图片路径

30      */

31     public Stick(int panelWidth, int panelHeight, String path)

32             throws IOException {

33         // 调用父构造器

34         super(panelWidth, panelHeight, path);

35         // 设置y坐标

36         this.setY(panelHeight - super.getImage().getHeight(null));

37         // 设置原本的长度

38         this.preWidth = super.getImage().getWidth(null);

39     }

40 

41     /**

42      * 获取初始长度

43      * 

44      * @return int 初始长度

45      */

46     public int getPreWidth() {

47         return this.preWidth;

48     }

49 

50     /**

51      * 设置初始长度

52      * 

53      * @return void

54      */

55     public void setPreWidth(int preWidth) {

56         this.preWidth = preWidth;

57     }

58 

59 }
Stick

 

你可能感兴趣的:(java)