运用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.xGameCore.MAX_Y-16 ||rect.yboardRect.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 blocks=new ArrayList();//存放多个方块的集合
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;iGameCore.MIN_X && e.getX()
把这个添加到主面板上随时更新