小球弹砖块游戏,JAVA

运用javaGUI界面制作一个小球弹砖块的小游戏,本次游戏只有一个关卡,只是做一个简单的效果不是全部出来的

完整的下载链接:http://download.csdn.net/detail/zhuangjixiang/4874730

定义一个小球的类,挡板的类和砖块的类,这三个类可以抽取出来定义父类,然后继承,这样代码就可以减少很多了

思路是:先制作出小球碰到边框弹开,剥离到一个面板上,接着在面板上添加一个砖块,当小球碰到砖块的时候可以弹开并且砖块消失掉(是小球图片和砖块图片绘制成矩形,然后调用方法(ball.getRect().intersects(b.getRect())可以实现这个的时候就添加多个砖块到集合中然后遍历集合,接着定义小球运动边框范围

package obj;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;

import javax.imageio.ImageIO;

import util.GameCore;

/**
 * 
 * @author ZJX
 *定义球的属性以及方法
 */
public class Ball {

        private Image img;
        private Rectangle rect;
        private int speedX;
        private int speedY;
        private boolean isDispose=false;
        /**
         * 小球的构造方法
         * @param x定义小球的位置
         * @param y
         */
        public Ball(int x,int y) {
                super();
                
                try {
                        //加载图片
                        img=ImageIO.read(Ball.class.getResource("/img/ball.png"));
                        //为矩形 位置和大小初始化
                        rect=new Rectangle(x, y, img.getWidth(null), img.getHeight(null));
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                //初始化指定球的移动速度
                speedX=3;
                speedY=3;
                
        }
        
        /**
         * 更新小球数据
         */
        public void update(Rectangle boardRect){
                
                //以下是球在四周弹动过程,碰到四边框架时发生的弹动效果
                //如果球移动到窗体的最右边,这时X轴的移动要变成减,直接取反
                if(rect.x>GameCore.MAX_X-16 || rect.x<GameCore.MIN_X){
                        speedX*=-1;//X轴移动速度取反,使球的移动方向相反
                }
                if(rect.y>GameCore.MAX_Y-16 ||rect.y<GameCore.MIN_Y){
                        speedY*=-1;
                }
                //判断档板是否与球相交
                if(rect.intersects(boardRect)){
                        speedY*=-1;
                }
                //球的X和Y轴更新
                rect.setLocation(rect.x+speedX, rect.y+speedY);
                //判断球是否掉出去,如果是,游戏结束
                if(rect.y+16>boardRect.y+20){
                        isDispose=true;//标识球销毁
                }
        }
        
        /**
         * 绘制小球
         * @param g
         */
        public void draws(Graphics g){
                g.drawImage(img,rect.x, rect.y,null);
        }
        
        public Image getImg() {
                return img;
        }
        public void setImg(Image img) {
                this.img = img;
        }
        public Rectangle getRect() {
                return rect;
        }
        public void setRect(Rectangle rect) {
                this.rect = rect;
        }
        public int getSpeedX() {
                return speedX;
        }
        public void setSpeedX(int speedX) {
                this.speedX = speedX;
        }
        public int getSpeedY() {
                return speedY;
        }
        public void setSpeedY(int speedY) {
                this.speedY = speedY;
        }
        public boolean isDispose() {
                return isDispose;
        }
        public void setDispose(boolean isDispose) {
                this.isDispose = isDispose;
        }
        
        
}

挡板的代码

package obj;
/**
 * 定义挡板的类
 */
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Board {

        private Image img;
        private Rectangle rect;
        public Board(int x,int y) {
                super();
                //加载图片
                try {
                        img=ImageIO.read(Board.class.getResource("/img/board.png"));
                        //为矩形 位置和大小初始化
                        rect=new Rectangle(x, y, img.getWidth(null), img.getHeight(null));
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
        /**
         * 
         * @param g绘制挡板
         */
        public void draws(Graphics g){
                g.drawImage(img,rect.x, rect.y, null);
        }
        public Rectangle getRect() {
                return rect;
        }
        public void setRect(Rectangle rect) {
                this.rect = rect;
        }

}

砖块的代码

package obj;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.io.IOException;

import javax.imageio.ImageIO;

import util.GameCore;

/**
 * 
 * @author ZJX
 *定义砖块的类
 */
public class Block {
        private Image img;
        private Rectangle rect;
        /**
         * 砖块的构造函数
         */
        public Block(int x,int y) {
                super();
                //加载图片
                int type=GameCore.RAN.nextInt(7)+1;//随机生成一张图片类型
                try {
                        //加载图片
                        img=ImageIO.read(Block.class.getResource("/img/block"+type+".png"));
                        //为矩形 位置和大小初始化
                        rect=new Rectangle(x, y, img.getWidth(null), img.getHeight(null));
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
        /**
         * 绘制砖块
         * @param g
         */
        public void draws(Graphics g){
                g.drawImage(img, rect.x, rect.y, null);
                
        }
        
        public Rectangle getRect() {
                return rect;
        }
        public void setRect(Rectangle rect) {
                this.rect = rect;
        }
        
}

定义一个工具类,里面是需要用到的参数,主要是界面的大小以及小球运动的位置

package util;

import java.util.Random;

/**
 * @author Administrator
 *游戏中的全局变量或方法
 */
public class GameCore {
        /**
         * 游戏界面的宽度
         */
        public static final int GAME_WIDHT=640;
        /**
         * 游戏界面的高度
         */
        public static final int GAME_HEIGHT=480;
        
        //以下四个变量,保存游戏中X轴和Y轴最大和最小可移动的位置
        public static final int MIN_X=135;
        public static final int MAX_X=515;
        public static final int MAX_Y=480;
        public static final int MIN_Y=30;
        
        /**
         * 随机种子
         */
        public static Random RAN=new Random();
}

添加一个面板

package frame;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.io.IOException;
import java.util.*;

import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import obj.*;
import util.GameCore;

public class GamePanel extends JPanel implements MouseMotionListener{

        private Image bgImg;//主界面的背景图片
        private Ball ball=null;//球的对象
        private Board board=null;//挡板对象
        List<Block> blocks=new ArrayList<Block>();//存放多个方块的集合
        private int maxLife=5;//最大可以使用生命的次数
        private int currentLife=1;//当前使用的生命次数
        /**
         * Create the panel.
         */
        public GamePanel() {
                setLayout(null);
                //加载背景图片
                try {
                        bgImg=ImageIO.read(GamePanel.class.getResource("/img/1.png"));
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                ball=new Ball(200,300);
                board=new Board(200,400);
                //绑定事件
                this.addMouseMotionListener(this);
                initBlocks();

        }
        /**
         * 初始化砖块
         */
        public void initBlocks(){
                for(int row=0;row<10;row++){
                        for(int col=0;col<12;col++){
                                Block b=new Block(col*30+145,row*15+30);
                                blocks.add(b);//添加到集合中
                        }
                }
        }
        //更新球的位置
        public void update(){
                //更新球的数据
                if(ball!=null){
                        ball.update(board.getRect());
                        //将球和所有的方块进行检测 ,是否有相交,如果有,则销毁方块
                        for(int i=0;i<blocks.size();i++){
                                Block b=blocks.get(i);
                                if(ball.getRect().intersects(b.getRect())){
                                        blocks.remove(i);//移动对象
                                        //球的移动方向反弹
                                        ball.setSpeedY(ball.getSpeedY()*-1);
                                        break;
                                }
                        }
                        //判断如果球被销毁
                        if(ball.isDispose()){
                                ball=null;
                                if(currentLife<maxLife){
                                        ball=new Ball(board.getRect().x+60, board.getRect().y-30);
                                        currentLife++;
                                }else{
                                        JOptionPane.showMessageDialog(null, "游戏结束!");
                                }
                        }
                }
        }

        @Override
        public void paint(Graphics g) {
                // TODO Auto-generated method stub
                g.drawImage(bgImg, 0, 0, null);
                //调用球的绘制方法
                if(ball!=null)
                        ball.draws(g);
                board.draws(g);
                for(int i=0;i<blocks.size();i++){
                        blocks.get(i).draws(g);
                }
                //设置字体
                g.setFont(new Font("宋体", Font.BOLD, 15));
                g.setColor(Color.WHITE);
                g.drawString("当前生命:"+(maxLife-currentLife), 10, 90);
        }

        @Override
        public void mouseDragged(MouseEvent e) {
                // TODO Auto-generated method stub
                
        }

        @Override
        public void mouseMoved(MouseEvent e) {
                // TODO Auto-generated method stub
                if(e.getX()>GameCore.MIN_X && e.getX()<GameCore.MAX_X-116){
                        board.getRect().setLocation(e.getX(), board.getRect().y);
                }
                
        }
        
        

}

把这个添加到主面板上随时更新