Java简单游戏开发之碰撞检测(2)

发表于:2013-05-31来源:Csdn作者:一个小菜仔点击数: 标签:java
对于子弹和障碍物的碰撞检测,采用上述第一种方法就可以简单的实现了,不过子弹是圆形的 有没有更加精确的碰撞检测方法呢?也就是实现圆形和矩形的

  对于子弹和障碍物的碰撞检测,采用上述第一种方法就可以简单的实现了,不过子弹是圆形的

  有没有更加精确的碰撞检测方法呢?也就是实现圆形和矩形的碰撞检测嘛。

  这里我们需要简单的运行下几何数学的知识,给个简单的图就会明白了。

  小圆有个运动轨迹,轨迹的线如果和他对着的正方形的相对某一象限的边有焦点,那么

  就能碰撞,边就是那一个象限的边(还要把圆半径算进去),具体代码就不实现了,读者可

  自己尝试着去实现。

  不规则图形碰撞检测

  这里直接转载一篇文章:

  http://www.cnblogs.com/Kurodo/archive/2012/08/08/2628688.html

  对于矩形碰撞,很多人都知道。但面对多边形图形,大多数采用多矩形覆盖的方式。

  但是我不是很喜欢这种方式,我所采用的是利用一个经典算法:

  SAT 一种可以快速检测不规则的凸多边形是否碰撞的算法

  给出两个凸多边形体,如果我们能找到一个轴线,使两物体在此轴线上的投影不重叠,则这

  两个物体之间没有发生碰撞,这个轴线叫做Separating Axis(红色轴线)。

  对于2D来说,红色线就是垂直与多边形边的轴。

  因此,如果我们要检查两多边形是否碰撞,就去检查两多边形在每个所有可能的轴上的投影

  是否重叠。

  [java] view plaincopyprint?

  /// 检测2个矩形是否发生碰撞

  ///

  ///

  public static bool IsIntersect (Vector2[] A, Vector2[] B)

  {

  Vector2 AX, AY, BX, BY;

  AX = new Vector2();

  AY = new Vector2();

  BX = new Vector2();

  BY = new Vector2();

  AX.X = A[0].X - A[1].X;

  AX.Y = A[0].Y - A[1].Y;

  AY.X = A[0].X - A[3].X;

  AY.Y = A[0].Y - A[3].Y;

  BX.X = B[0].X - B[1].X;

  BX.Y = B[0].Y - B[1].Y;

  BY.X = B[0].X - B[3].X;

  BY.Y = B[0].Y - B[3].Y;

  //对于AX上:

  if (Tmp(AX, A, B)) return false;

  if (Tmp(AY, A, B)) return false;

  if (Tmp(BX, A, B)) return false;

  if (Tmp(BY, A, B)) return false;

  return true;

  }

  private static bool Tmp(Vector2 IS,Vector2[] A,Vector2[] B)

  {

  float[] v = new float[4];

  for (int i = 0; i < 4; i++)

  {

  float tmp = (IS.X * A[i].X + IS.Y * A[i].Y) / (IS.X * IS.X + IS.Y * IS.Y);

  v[i] = tmp * IS.X * IS.X + tmp * IS.Y * IS.Y;

  }

  float[] vv = new float[4];

  for (int i = 0; i < 4; i++)

  {

  float tmp = (IS.X * B[i].X + IS.Y * B[i].Y) / (IS.X * IS.X + IS.Y * IS.Y);

  vv[i] = tmp * IS.X * IS.X + tmp * IS.Y * IS.Y;

  }

  if (Math.Max(Math.Max(v[0], v[1]),Math.Max(v[2],v[3])) >Math.Min(Math.Min(vv[0],vv[1]),Math.Min(vv[2],vv[3])) && Math.Min(Math.Min(v[0],v[1]),Math.Min(v[2],v[3])) < Math.Max(Math.Max(vv[0],vv[1]),Math.Max(vv[2],vv[3]))) {

  return false;

  }//表示暂时不知道是否碰撞

  else return true;//表示知道未碰撞

  }

原文转自:http://www.ltesting.net