疯狂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 yangenxiong2009@gmail.com 12 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
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 yangenxiong2009@gmail.com 12 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
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 yangenxiong2009@gmail.com 21 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.io.IOException; 4 5 import javax.swing.JFrame; 6 7 /** 8 * 游戏入口类 9 * 10 * @author yangenxiong yangenxiong2009@gmail.com 11 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
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 yangenxiong2009@gmail.com 12 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.awt.Image; 4 import java.io.IOException; 5 6 /** 7 * 砖块类 8 * 9 * @author yangenxiong yangenxiong2009@gmail.com 10 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.io.IOException; 4 5 /** 6 * 道具对象 7 * 8 * @author yangenxiong yangenxiong2009@gmail.com 9 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.io.IOException; 4 5 /** 6 * 使挡板变长的道具 7 * 8 * @author yangenxiong yangenxiong2009@gmail.com 9 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.io.IOException; 4 5 /** 6 * 使挡板变短的道具 7 * 8 * @author yangenxiong yangenxiong2009@gmail.com 9 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }
1 package org.crazyit.ball; 2 3 import java.io.IOException; 4 5 /** 6 * 挡板类 7 * 8 * @author yangenxiong yangenxiong2009@gmail.com 9 * @author Kelvin Mak kelvin.mak125@gmail.com 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 }