由於 不同安卓 不同蘋果系統,他們的浮點數 不一樣,所以,如果用 unity自帶的 Physics2D,來檢測碰撞,肯定是有問題的。
我看了下網上,碰撞檢測 有 分離軸檢測 和 四叉樹檢測。
我覺得 有點小題大做了!!
游戲人物 我都定義是 圓形,不需要多邊形。建築都是 矩形。
那么,所得的算法無非就是以下幾種。
點和矩形碰撞
/**
*
* @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;
}
矩形碰撞
/**
* 檢測兩個矩形是否碰撞
* @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) ,半徑r
if (Math.sqrt(Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2)) <= r) {
// 如果點和圓心距離小於或等於半徑則認為發生碰撞
return true;
}
圓和圓
/**
* 圓形碰撞
*
* @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));
就先寫到這里吧

