幀同步 檢測碰撞

因爲 不一樣安卓 不一樣蘋果系統,他們的浮點數 不同,因此,若是用 unity自帶的 Physics2D,來檢測碰撞,確定是有問題的。算法

我看了下網上,碰撞檢測 有 分離軸檢測 和 四叉樹檢測。dom

我以爲 有點小題大作了!!spa

遊戲人物  我都定義是  圓形,不須要多邊形。建築都是 矩形。code

那麼,所得的算法無非就是如下幾種。blog

點和矩形碰撞遊戲

複製代碼
/** 
     *  
     * @param x1 點 
     * @param y1 點 
     * @param x2 矩形view x 
     * @param y2 矩形view y 
     * @param w  矩形view 寬 
     * @param h  矩形view 高 
     * @return 
     */  
    public static boolean isCollision(int x1, int y1, int x2, int y2, int w, int h) {  
        if (x1 >= x2 && x1 <= x2 + w && y1 >= y2 && y1 <= y2 + h) {  
            return true;  
        }   
        return false;  
    }  
複製代碼

矩形碰撞it

複製代碼
/** 
     * 檢測兩個矩形是否碰撞 
     * @return 
     */  
    public boolean isCollisionWithRect(int x1, int y1, int w1, int h1,   
            int x2,int y2, int w2, int h2) {  
        if (x1 >= x2 && x1 >= x2 + w2) {  
            return false;  
        } else if (x1 <= x2 && x1 + w1 <= x2) {  
            return false;  
        } else if (y1 >= y2 && y1 >= y2 + h2) {  
            return false;  
        } else if (y1 <= y2 && y1 + h1 <= y2) {  
            return false;  
        }  
        return true;  
    }  
複製代碼

點(x1,x2) , 圓心(x2,y2) ,半徑rio

if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {  
            // 若是點和圓心距離小於或等於半徑則認爲發生碰撞  
            return true;  
        }  

圓和圓class

複製代碼
/** 
     * 圓形碰撞 
     *  
     * @param x1 
     *            圓形1的圓心X座標 
     * @param y1 
     *            圓形2的圓心X座標 
     * @param x2 
     *            圓形1的圓心Y座標 
     * @param y2 
     *            圓形2的圓心Y座標 
     * @param r1 
     *            圓形1的半徑 
     * @param r2 
     *            圓形2的半徑 
     * @return 
     */  
    private boolean isCollisionWithCircle(int x1, int y1, int x2, int y2,  
            int r1, int r2) {  
        // Math.sqrt:開平方  
        // Math.pow(double x, double y): X的Y次方  
        //直角座標系,依點1和點2作平行線,|x1-x2|爲橫向直角邊,|y1-y2|爲縱向直角邊 依勾股定理 c^2=a^2+b^2  
        if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r1 + r2) {  
            // 若是兩圓的圓心距小於或等於兩圓半徑和則認爲發生碰撞  
            return true;  
        }  
        return false;  
    }  

可是,有人要提出,浮點運算 不一樣的問題,那我推薦 你們用 定點數 Fix64。隨機數

 

 具體哪裏,本身百度找吧。他還自帶了一個隨機定點數,隨機的結果是 固定的,這樣就不須要 本身寫n多數據來 作假 隨機數了。

 

 

用法也簡單。

好比 上面 人物檢測 碰撞,就是 點 到 圓心,看看是否 超過 你要的 半徑。

       // x1-x2   y1-y2
            print(Fix64.Sqrt(Fix64.Pow(((Fix64)2.2f - (Fix64)1.4f), 2) + Fix64.Pow(((Fix64)3.3f - (Fix64)4.2f),2)));
            print(Math.Sqrt(Math.Pow(2.2f - 1.4f,2) + Math.Pow(3.3f - 4.2f, 2)));

使用定點數後,不一樣的安卓手機,輸出的結果是同樣的。

座標定義也簡單 :FixVector2 FixVector3 替代過去的Vector2 Vector3

輸出就是 vec.ToVector2()

隨機數:

 SRandom room = new SRandom(20000);
  for (int i = 0; i < 432;i++ )
  print(vec.ToVector2() + "  " + room.Range(0, 999));

 

就先寫到這裏吧

相關文章
相關標籤/搜索