• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>