一、游戏效果图:玩家飞机与敌机碰撞 或子弹与敌机碰撞,产生爆炸效果,敌机与子弹在爆炸后消失。
二、实现原理:检测原理的两个对象是否碰撞,JAVA提供了Rectangle这个类,里面的intersects(Rectangle r)方法可以完成这种需求。目前的做法是,把屏幕内的子弹与飞机进行遍历,在遍历的过程用这个方法去检测是否有碰撞出现。
三、敌机与子弹碰撞代码:
package com.jack;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ImageObserver;
import javax.swing.JPanel;
import com.jack.imp.IPlan;
/**
*
* @author laughing
* @date 2014年11月20日 下午11:03:11
*/
public class Enemy3 implements IPlan {
private static final Image[] Enemy1_IMAGES = ImageManager.getInstance()
.getImagesByType("e3");
private static final Image[] BOMB_IMAGES = ImageManager.getInstance()
.getImagesByType("bomb");
private int x = 370;
private int y = 0;
private static final int SPEED = 20;
private boolean outOfBounds = false;
private boolean isCollision = false;
@Override
public void drawMyself(Graphics g, JPanel p) {
if (isCollision) {
for (int i = 0; i < BOMB_IMAGES.length; i++) {
g.drawImage(BOMB_IMAGES[i], x, y, (ImageObserver) p);
}
} else {
g.drawImage(Enemy1_IMAGES[0], x, y, (ImageObserver) p);
}
}
@Override
public void move() {
if (y >= GamePanel.HEIGHT) {
setOutOfBounds(true);
} else {
y += SPEED;
}
}
@Override
public void shut() {
// TODO Auto-generated method stub
}
@Override
public boolean collison(Rectangle r) {
Rectangle enemy1 = new Rectangle( x,
y,
Enemy1_IMAGES[0].getWidth(null),
Enemy1_IMAGES[0].getHeight(null));
if (enemy1.intersects(r)) {
setCollision(true);
return true;
}
return false;
}
/**
* @return the outOfBounds
*/
public boolean isOutOfBounds() {
return outOfBounds;
}
/**
* @param outOfBounds
* the outOfBounds to set
*/
public void setOutOfBounds(boolean outOfBounds) {
this.outOfBounds = outOfBounds;
}
/*
* (non-Javadoc)
*
* @see com.jack.imp.IPlan#isOutofBounds()
*/
@Override
public boolean isOutofBounds() {
// TODO Auto-generated method stub
return outOfBounds;
}
/**
* @return the isCollision
*/
public boolean isCollision() {
return isCollision;
}
/**
* @param isCollision
* the isCollision to set
*/
public void setCollision(boolean isCollision) {
this.isCollision = isCollision;
}
}
package com.jack;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.ImageObserver;
import javax.swing.JPanel;
import com.jack.imp.IDraw;
/**
* 游戏子弹
*
* @author laughing
* @date 2014年11月20日 上午10:27:12
*/
public class Bullet implements IDraw {
public static final Image[] BULLET_IMAGES = ImageManager.getInstance()
.getImagesByType("bullet");
public static final Image[] BOMB_IMAGES = ImageManager.getInstance()
.getImagesByType("bomb");
public static final int FLY_SPEED = 30;
private boolean outOfBounds = false;
private boolean isCollision = false;
public int x;
public int y;
public Bullet(int x, int y) {
this.x = x + 38;
this.y = y;
}
public boolean outOfBounds() {
if (this.y == 0) {
this.outOfBounds = true;
return true;
}
return false;
}
public Rectangle castRectangle() {
return new Rectangle( x,
y,
BULLET_IMAGES[0].getWidth(null),
BULLET_IMAGES[0].getHeight(null));
}
/*
* (non-Javadoc)
*
* @see com.jack.imp.IProcess#drawMyself(java.awt.Graphics,
* javax.swing.JPanel)
*/
@Override
public void drawMyself(Graphics g, JPanel p) {
if (isCollision()) {
g.drawImage(BOMB_IMAGES[0],
x,
y - BOMB_IMAGES[0].getHeight(null),
(ImageObserver) p);
} else {
g.drawImage(BULLET_IMAGES[0],
x,
y - BULLET_IMAGES[0].getHeight(null),
(ImageObserver) p);
}
}
/*
* (non-Javadoc)
*
* @see com.jack.imp.IProcess#move()
*/
@Override
public void move() {
if (!outOfBounds())
this.y -= FLY_SPEED;
}
/**
* @return the y
*/
public int getY() {
return y;
}
/**
* @return the x
*/
public int getX() {
return x;
}
/**
* @return the outOfBounds
*/
public boolean isOutOfBounds() {
return outOfBounds;
}
/**
* @param outOfBounds
* the outOfBounds to set
*/
public void setOutOfBounds(boolean outOfBounds) {
this.outOfBounds = outOfBounds;
}
/**
* @return the isCollision
*/
public boolean isCollision() {
return isCollision;
}
/**
* @param isCollision
* the isCollision to set
*/
public void setCollision(boolean isCollision) {
this.isCollision = isCollision;
}
/*
* (non-Javadoc)
*
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
return "Bullet [outOfBounds=" + outOfBounds + ", isCollision=" + isCollision + ", x=" + x + ", y=" + y + "]";
}
}