JAVA游戏简单碰撞原理实例源码教程。
一、游戏效果图:玩家飞机与敌机碰撞 或子弹与敌机碰撞,产生爆炸效果,敌机与子弹在爆炸后消失。
二、实现原理:检测原理的两个对象是否碰撞,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 + "]“;
- }
- }