碰撞偵測是遊戲核心邏輯之一。本文解析最基礎的矩形-矩形與圓形-圓形碰撞數學模型,提供無浮點運算的整數實作程式碼,適合 CLDC 1.0 環境。
(x1, y1)、寬 w1、高 h1(x2, y2)、寬 w2、高 h2兩矩形中心點在 X 軸距離 ≤ 寬度和一半,且 Y 軸距離 ≤ 高度和一半:
| (x1 + w1/2) - (x2 + w2/2) | ≤ (w1 + w2) / 2
| (y1 + h1/2) - (y2 + h2/2) | ≤ (h1 + h2) / 2
public boolean rectCollide(int x1, int y1, int w1, int h1,
int x2, int y2, int w2, int h2) {
// 中心點座標 ×2(避免除法)
int cx1 = 2*x1 + w1;
int cy1 = 2*y1 + h1;
int cx2 = 2*x2 + w2;
int cy2 = 2*y2 + h2;
int dx = cx1 > cx2 ? cx1 - cx2 : cx2 - cx1; // 手寫 abs
int dy = cy1 > cy2 ? cy1 - cy2 : cy2 - cy1;
int wSum = w1 + w2;
int hSum = h1 + h2;
return dx <= wSum && dy <= hSum;
}
缺點:矩形碰撞為「包圍盒」近似,非矩形物體(如三角形、不規則精靈)會產生誤判(假陽性)。
(x1, y1)、半徑 r1(x2, y2)、半徑 r2兩圓心距離 < 半徑和。為避免開根號(無浮點、效能差),兩邊平方:
(x1 - x2)² + (y1 - y2)² < (r1 + r2)²
public boolean circleCollide(int x1, int y1, int r1,
int x2, int y2, int r2) {
int dx = x1 - x2;
int dy = y1 - y2;
int rSum = r1 + r2;
return dx*dx + dy*dy < rSum*rSum;
}
優點:精確、運算極快、無浮點需求。
適用:子彈、圓形敵人、圓形道具、角色近似圓形碰撞體。
複雜物體(如飛機、人型角色)可拆解為多個基礎形狀組合:
new Rectangle() 等),使用基本型別參數