zoukankan      html  css  js  c++  java
  • 小球弹砖块游戏(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);
    		}
    		
    	}
    	
    	
    
    }
    

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

  • 相关阅读:
    win10操作技巧介绍,很实用!
    信息时代与人工智能时代的教育变革
    《此生未完成》痛句摘抄(3)
    《下辈子还教书》经典语录(1)
    《给教师的阅读建议》经典语录
    《此生未完成》痛句摘抄(4)
    记录程序人生2020.8.11
    最全、最详细的配置jdk十步法!
    《此生未完成》痛句摘录(2)
    “温室里的花朵”也要直面困难
  • 原文地址:https://www.cnblogs.com/zhuangjixiang/p/2813725.html
Copyright © 2011-2022 走看看