首页 > 代码库 > 游戏中常用到的碰撞检测帮助类

游戏中常用到的碰撞检测帮助类

 游戏中咱们经常用到碰撞检测,一般的游戏引擎也会自带有自身的检测碰撞类,但有时候不过灵活,这时候我们希望自己可以自定义一些碰撞检测类。tong顶一些啊。。。

  1. import android.graphics.Rect;


  2. public class CollisionUtil {

  3.         /**

  4.          * 矩形碰撞检测 参数为x,y,width,height

  5.          * 

  6.          * @param x1

  7.          *            第一个矩形的x

  8.          * @param y1

  9.          *            第一个矩形的y

  10.          * @param w1

  11.          *            第一个矩形的w

  12.          * @param h1

  13.          *            第一个矩形的h

  14.          * @param x2

  15.          *            第二个矩形的x

  16.          * @param y2

  17.          *            第二个矩形的y

  18.          * @param w2

  19.          *            第二个矩形的w

  20.          * @param h2

  21.          *            第二个矩形的h

  22.          * [url=home.php?mod=space&uid=7300]@return[/url] 是否碰撞

  23.          */

  24.         public static boolean IsRectCollision(float x1, float y1, float w1,

  25.                         float h1, float x2, float y2, float w2, float h2) {

  26.                 if (x2 > x1 && x2 > x1 + w1) {

  27.                         return false;

  28.                 } else if (x2 < x1 && x2 < x1 - w2) {

  29.                         return false;

  30.                 } else if (y2 > y1 && y2 > y1 + h1) {

  31.                         return false;

  32.                 } else if (y2 < y1 && y2 < y1 - h2) {

  33.                         return false;

  34.                 } else {

  35.                         return true;

  36.                 }

  37.         }


  38.         /**

  39.          * 矩形碰撞检测 参数为Rect对象

  40.          * 

  41.          * @param r1

  42.          *            第一个Rect对象

  43.          * @param r2

  44.          *            第二个Rect对象

  45.          * @return 是否碰撞

  46.          */

  47.         public static boolean IsRectCollision(Rect r1, Rect r2) {

  48.                 return IsRectCollision(r1.left, r1.top, r1.right - r1.left, r1.bottom

  49.                                 - r1.top, r2.left, r2.top, r2.right - r2.left, r2.bottom

  50.                                 - r2.top);

  51.         }


  52.         /**

  53.          * 圆形碰撞检测

  54.          * 

  55.          * @param x1

  56.          *            第一个圆的圆心x

  57.          * @param y1

  58.          *            第一个圆的圆心y

  59.          * @param r1

  60.          *            第一个圆的半径

  61.          * @param x2

  62.          *            第二个圆的圆心x

  63.          * @param y2

  64.          *            第二个圆的圆心y

  65.          * @param r2

  66.          *            第二个圆的半径

  67.          * @return 是否碰撞

  68.          */

  69.         public static boolean IsCircleCollision(int x1, int y1, int r1, int x2,

  70.                         int y2, int r2) {

  71.                 // 两点距大于 2圆形半径距离

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

  73.                         return false;

  74.                 }

  75.                 return true;

  76.         }


  77.         /**

  78.          * 圆形与矩形碰撞检测

  79.          * 

  80.          * @param x1

  81.          *            第一个矩形的x

  82.          * @param y1

  83.          *            第一个矩形的y

  84.          * @param w1

  85.          *            第一个矩形的宽

  86.          * @param h1

  87.          *            第一个矩形的高

  88.          * @param x2

  89.          *            圆的圆心x

  90.          * @param y2

  91.          *            圆的圆心y

  92.          * @param r2

  93.          *            圆的半径r

  94.          * @return 是否碰撞

  95.          */

  96.         public static boolean IsC2RCollision(int x1, int y1, int w1, int h1,

  97.                         int x2, int y2, int r2) {

  98.                 if ((Math.abs(x2 - (x1 + w1 / 2)) > w1 / 2 + r2)

  99.                                 || Math.abs(y2 - (y1 + h1 / 2)) > h1 / 2 + r2) {

  100.                         return false;

  101.                 }

  102.                 return true;

  103.         }


  104.         /**

  105.          * 多矩形碰撞

  106.          * 

  107.          * @param rArray1

  108.          * @param rArray2

  109.          * @return 是否碰撞

  110.          */

  111.         public static boolean IsRectsCollision(Rect[] rArray1, Rect[] rArray2) {

  112.                 for (Rect rt1 : rArray1) {

  113.                         for (Rect rt2 : rArray2) {

  114.                                 if (IsRectCollision(rt1, rt2)) {

  115.                                         return true;

  116.                                 }

  117.                         }

  118.                 }

  119.                 return false;

  120.         }


  121. }


复制代码

 http://www.eoeandroid.com/forum-863-1.html

www.ogengine.com