• 疯狂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 }
    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 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 }
    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 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 }
    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 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 }
    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 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 }
    BallService
     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 }
    Brick
     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 }
    Magic
     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 }
    LongMagic
     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 }
    ShortMagic
     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 }
    Stick
  • 相关阅读:
    JScript运行批处理命令的做法
    java_main
    MySQL 数据库设计 笔记与总结(1)需求分析
    学技术真累
    学习Spring框架等技术的方向、方法和动机
    学习Spring框架等技术的方向、方法和动机
    个人知识管理是职场必修课
    个人知识管理是职场必修课
    提高生产力的2个方法:软件复用和知识库
    提高生产力的2个方法:软件复用和知识库
  • 原文地址:https://www.cnblogs.com/lyunyu/p/3394069.html
Copyright © 2020-2023  润新知