小球弹砖块游戏(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); } } }
把这个添加到主面板上随时更新