一、矩形与矩形的碰撞

 

用反向思维,除了不碰撞的都是碰撞的。

四种情况

如图:

         口1

口2 口    口3

         口4

红色表示相对应的矩形

则 有x1 y1 w1 h1

      X2 y2 w2 h2

 

1的情况

y2 < y1 && y2 < y1 - h2

2的情况

x2 < x1 && x2 < x1 - w2

3的情况

x2 > x1 && x2 > x1 + w1

4的情况

y2 > y1 && y2 > y1 + h1

 

二、圆形与圆形的碰撞

主要就是判断圆心距离

(Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2)

Math.pow(double a,double b)a的b次方

 

三、圆形与矩形的碰撞

 

第一种:就是圆形与矩形边框的碰撞检测

检测Y轴圆心到矩中心的距离是否小于半径+矩形X轴1/2

检测X轴圆心到矩中心的距离是否小于半径+矩形Y轴1/2

 

第二种:就是特殊的矩形四个角检测

四个矩形顶角到圆心的距离是否小于半径

 

四、多矩形的碰撞

把不规则图片看成多矩形然后检验碰撞。

 

下面是我自己封装的一个碰撞类

封装了上面几个加上

2组矩形数组内容之间检验是否碰撞的类

 
Java代码  
  1. package com.lurencun.SurfaceUtil;   
  2.   
  3. import android.graphics.Rect;   
  4.   
  5. /**  
  6.  * 游戏碰撞检测类  
  7.  *   
  8.  * @author poolo  
  9.  * @version 1.00  
  10.  */  
  11. public class CollisionUtil {   
  12.   
  13.     /**  
  14.      * 矩形碰撞检测 参数为x,y,width,height  
  15.      *   
  16.      * @param x1  
  17.      *            第一个矩形的x  
  18.      * @param y1  
  19.      *            第一个矩形的y  
  20.      * @param w1  
  21.      *            第一个矩形的w  
  22.      * @param h1  
  23.      *            第一个矩形的h  
  24.      * @param x2  
  25.      *            第二个矩形的x  
  26.      * @param y2  
  27.      *            第二个矩形的y  
  28.      * @param w2  
  29.      *            第二个矩形的w  
  30.      * @param h2  
  31.      *            第二个矩形的h  
  32.      * @return 是否碰撞  
  33.      */  
  34.     public boolean IsRectCollision(int x1, int y1, int w1, int h1, int x2,   
  35.             int y2, int w2, int h2) {   
  36.         if (x2 > x1 && x2 > x1 + w1) {   
  37.             return false;   
  38.         } else if (x2 < x1 && x2 < x1 - w2) {   
  39.             return false;   
  40.         } else if (y2 > y1 && y2 > y1 + h1) {   
  41.             return false;   
  42.         } else if (y2 < y1 && y2 < y1 - h2) {   
  43.             return false;   
  44.         } else {   
  45.             return true;   
  46.         }   
  47.     }   
  48.   
  49.     /**  
  50.      * 矩形碰撞检测 参数为Rect对象  
  51.      *   
  52.      * @param r1  
  53.      *            第一个Rect对象  
  54.      * @param r2  
  55.      *            第二个Rect对象  
  56.      * @return 是否碰撞  
  57.      */  
  58.     public boolean IsRectCollision(Rect r1, Rect r2) {   
  59.         return IsRectCollision(r1.left, r1.top, r1.right - r1.left, r1.bottom   
  60.                 - r1.top, r2.left, r2.top, r2.right - r2.left, r2.bottom   
  61.                 - r2.top);   
  62.     }   
  63.   
  64.     /**  
  65.      * 圆形碰撞检测  
  66.      *   
  67.      * @param x1  
  68.      *            第一个圆的圆心x  
  69.      * @param y1  
  70.      *            第一个圆的圆心y  
  71.      * @param r1  
  72.      *            第一个圆的半径  
  73.      * @param x2  
  74.      *            第二个圆的圆心x  
  75.      * @param y2  
  76.      *            第二个圆的圆心y  
  77.      * @param r2  
  78.      *            第二个圆的半径  
  79.      * @return 是否碰撞  
  80.      */  
  81.     public boolean IsCircleCollision(int x1, int y1, int r1, int x2, int y2,   
  82.             int r2) {   
  83.         // 两点距大于 2圆形半径距离   
  84.         if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) > r1 + r2) {   
  85.             return false;   
  86.         }   
  87.         return true;   
  88.     }   
  89.   
  90.     /**  
  91.      * 圆形与矩形碰撞检测  
  92.      *   
  93.      * @param x1  
  94.      *            第一个矩形的x  
  95.      * @param y1  
  96.      *            第一个矩形的y  
  97.      * @param w1  
  98.      *            第一个矩形的宽  
  99.      * @param h1  
  100.      *            第一个矩形的高  
  101.      * @param x2  
  102.      *            圆的圆心x  
  103.      * @param y2  
  104.      *            圆的圆心y  
  105.      * @param r2  
  106.      *            圆的半径r  
  107.      * @return 是否碰撞  
  108.      */  
  109.     public boolean IsC2RCollision(int x1, int y1, int w1, int h1, int x2,   
  110.             int y2, int r2) {   
  111.         if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)   
  112.                 || Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {   
  113.             return false;   
  114.         }   
  115.         return true;   
  116.     }   
  117.   
  118.     /**  
  119.      * 多矩形碰撞  
  120.      *   
  121.      * @param rArray1  
  122.      * @param rArray2  
  123.      * @return 是否碰撞  
  124.      */  
  125.     public boolean IsRectsCollision(Rect[] rArray1, Rect[] rArray2) {   
  126.         for (Rect rt1 : rArray1) {   
  127.             for (Rect rt2 : rArray2) {   
  128.                 if (IsRectCollision(rt1, rt2)) {   
  129.                     return true;   
  130.                 }   
  131.   
  132.             }   
  133.         }   
  134.         return false;   
  135.     }   
  136.   
  137. }  
posted on 2012-09-10 09:47  忆冉  阅读(4059)  评论(1编辑  收藏  举报