JAVA游戏简单碰撞原理



JAVA游戏简单碰撞原理实例源码教程。

一、游戏效果图:玩家飞机与敌机碰撞 或子弹与敌机碰撞,产生爆炸效果,敌机与子弹在爆炸后消失。

 

二、实现原理:检测原理的两个对象是否碰撞,JAVA提供了Rectangle这个类,里面的intersects(Rectangle r)方法可以完成这种需求。目前的做法是,把屏幕内的子弹与飞机进行遍历,在遍历的过程用这个方法去检测是否有碰撞出现。

三、敌机与子弹碰撞代码:

 

  1. package com.jack;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.Rectangle;
  5. import java.awt.image.ImageObserver;
  6. import javax.swing.JPanel;
  7. import com.jack.imp.IPlan;
  8. /**
  9.  *
  10.  * @author laughing
  11.  * @date 2014年11月20日 下午11:03:11
  12.  */
  13. public class Enemy3 implements IPlan {
  14.     private static final Image[]    Enemy1_IMAGES   = ImageManager.getInstance()
  15.                                                                     .getImagesByType(“e3″);
  16.     private static final Image[]    BOMB_IMAGES     = ImageManager.getInstance()
  17.                                                                     .getImagesByType(“bomb”);
  18.     private int                     x               = 370;
  19.     private int                     y               = 0;
  20.     private static final int        SPEED           = 20;
  21.     private boolean                 outOfBounds     = false;
  22.     private boolean                 isCollision     = false;
  23.     @Override
  24.     public void drawMyself(Graphics g, JPanel p) {
  25.         if (isCollision) {
  26.             for (int i = 0; i < BOMB_IMAGES.length; i++) {
  27.                 g.drawImage(BOMB_IMAGES[i], x, y, (ImageObserver) p);
  28.             }
  29.         } else {
  30.             g.drawImage(Enemy1_IMAGES[0], x, y, (ImageObserver) p);
  31.         }
  32.     }
  33.     @Override
  34.     public void move() {
  35.         if (y >= GamePanel.HEIGHT) {
  36.             setOutOfBounds(true);
  37.         } else {
  38.             y += SPEED;
  39.         }
  40.     }
  41.     @Override
  42.     public void shut() {
  43.         // TODO Auto-generated method stub
  44.     }
  45.     @Override
  46.     public boolean collison(Rectangle r) {
  47.         Rectangle enemy1 = new Rectangle(   x,
  48.                                             y,
  49.                                             Enemy1_IMAGES[0].getWidth(null),
  50.                                             Enemy1_IMAGES[0].getHeight(null));
  51.         if (enemy1.intersects(r)) {
  52.             setCollision(true);
  53.             return true;
  54.         }
  55.         return false;
  56.     }
  57.     /**
  58.      * @return the outOfBounds
  59.      */
  60.     public boolean isOutOfBounds() {
  61.         return outOfBounds;
  62.     }
  63.     /**
  64.      * @param outOfBounds
  65.      *            the outOfBounds to set
  66.      */
  67.     public void setOutOfBounds(boolean outOfBounds) {
  68.         this.outOfBounds = outOfBounds;
  69.     }
  70.     /*
  71.      * (non-Javadoc)
  72.      *
  73.      * @see com.jack.imp.IPlan#isOutofBounds()
  74.      */
  75.     @Override
  76.     public boolean isOutofBounds() {
  77.         // TODO Auto-generated method stub
  78.         return outOfBounds;
  79.     }
  80.     /**
  81.      * @return the isCollision
  82.      */
  83.     public boolean isCollision() {
  84.         return isCollision;
  85.     }
  86.     /**
  87.      * @param isCollision
  88.      *            the isCollision to set
  89.      */
  90.     public void setCollision(boolean isCollision) {
  91.         this.isCollision = isCollision;
  92.     }
  93. }

 

  1. package com.jack;
  2. import java.awt.Graphics;
  3. import java.awt.Image;
  4. import java.awt.Rectangle;
  5. import java.awt.image.ImageObserver;
  6. import javax.swing.JPanel;
  7. import com.jack.imp.IDraw;
  8. /**
  9.  * 游戏子弹
  10.  *
  11.  * @author laughing
  12.  * @date 2014年11月20日 上午10:27:12
  13.  */
  14. public class Bullet implements IDraw {
  15.     public static final Image[] BULLET_IMAGES   = ImageManager.getInstance()
  16.                                                                 .getImagesByType(“bullet”);
  17.     public static final Image[] BOMB_IMAGES     = ImageManager.getInstance()
  18.                                                                 .getImagesByType(“bomb”);
  19.     public static final int     FLY_SPEED       = 30;
  20.     private boolean             outOfBounds     = false;
  21.     private boolean             isCollision     = false;
  22.     public int                  x;
  23.     public int                  y;
  24.     public Bullet(int x, int y) {
  25.         this.x = x + 38;
  26.         this.y = y;
  27.     }
  28.     public boolean outOfBounds() {
  29.         if (this.y == 0) {
  30.             this.outOfBounds = true;
  31.             return true;
  32.         }
  33.         return false;
  34.     }
  35.     public Rectangle castRectangle() {
  36.         return new Rectangle(   x,
  37.                                 y,
  38.                                 BULLET_IMAGES[0].getWidth(null),
  39.                                 BULLET_IMAGES[0].getHeight(null));
  40.     }
  41.     /*
  42.      * (non-Javadoc)
  43.      *
  44.      * @see com.jack.imp.IProcess#drawMyself(java.awt.Graphics,
  45.      * javax.swing.JPanel)
  46.      */
  47.     @Override
  48.     public void drawMyself(Graphics g, JPanel p) {
  49.         if (isCollision()) {
  50.             g.drawImage(BOMB_IMAGES[0],
  51.                         x,
  52.                         y - BOMB_IMAGES[0].getHeight(null),
  53.                         (ImageObserver) p);
  54.         } else {
  55.             g.drawImage(BULLET_IMAGES[0],
  56.                         x,
  57.                         y - BULLET_IMAGES[0].getHeight(null),
  58.                         (ImageObserver) p);
  59.         }
  60.     }
  61.     /*
  62.      * (non-Javadoc)
  63.      *
  64.      * @see com.jack.imp.IProcess#move()
  65.      */
  66.     @Override
  67.     public void move() {
  68.         if (!outOfBounds())
  69.             this.y -= FLY_SPEED;
  70.     }
  71.     /**
  72.      * @return the y
  73.      */
  74.     public int getY() {
  75.         return y;
  76.     }
  77.     /**
  78.      * @return the x
  79.      */
  80.     public int getX() {
  81.         return x;
  82.     }
  83.     /**
  84.      * @return the outOfBounds
  85.      */
  86.     public boolean isOutOfBounds() {
  87.         return outOfBounds;
  88.     }
  89.     /**
  90.      * @param outOfBounds
  91.      *            the outOfBounds to set
  92.      */
  93.     public void setOutOfBounds(boolean outOfBounds) {
  94.         this.outOfBounds = outOfBounds;
  95.     }
  96.     /**
  97.      * @return the isCollision
  98.      */
  99.     public boolean isCollision() {
  100.         return isCollision;
  101.     }
  102.     /**
  103.      * @param isCollision
  104.      *            the isCollision to set
  105.      */
  106.     public void setCollision(boolean isCollision) {
  107.         this.isCollision = isCollision;
  108.     }
  109.     /*
  110.      * (non-Javadoc)
  111.      *
  112.      * @see java.lang.Object#toString()
  113.      */
  114.     @Override
  115.     public String toString() {
  116.         return ”Bullet [outOfBounds=" + outOfBounds + ", isCollision=" + isCollision + ", x=" + x + ", y=" + y + "]“;
  117.     }
  118. }

 


四、源码:点击打开链接