遊戲開發中,碰撞偵測是核心邏輯之一:判斷子彈是否擊中敵機、角色是否撞牆、道具是否被拾取,本質皆為「兩物體是否重疊」。真實物體形狀往往複雜,實務上常將其分解為基本幾何形狀(矩形、圓形)組合,分別偵測再綜合判斷。
規則物體常近似為矩形。假設矩形 1 左上角 (x1, y1)、寬 w1、高 h1;矩形 2 為 (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) {
int dx = Math.abs((x1 + w1/2) - (x2 + w2/2));
int dy = Math.abs((y1 + h1/2) - (y2 + h2/2));
return dx <= (w1 + w2)/2 && dy <= (h1 + h2)/2;
}
此法簡單快速,但對非矩形物體精度較低。
圓形碰撞判斷最直觀:兩圓心距離 < 兩半徑之和。設圓 1 中心 (x1, y1)、半徑 r1;圓 2 為 (x2, y2)、r2。
距離公式含開根號,MIDP 1.0 無浮點數且運算慢,故兩邊同乘平方,消除開根號:
(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;
}
掌握基礎碰撞演算法後,可根據遊戲類型選擇適合的精度與效能平衡點。