小球弹砖块游戏(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);
		}
		
	}
	
	

}

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

 

posted @ 2012-12-11 21:46  吉利来  阅读(1530)  评论(0编辑  收藏  举报