首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 遊戲碰撞偵測基礎演算法:矩形與圓形碰撞數學模型與程式碼實作

     編輯:J2ME

碰撞偵測是遊戲核心邏輯之一。本文解析最基礎的矩形-矩形與圓形-圓形碰撞數學模型,提供無浮點運算的整數實作程式碼,適合 CLDC 1.0 環境。

一、矩形與矩形碰撞(AABB - Axis-Aligned Bounding Box)

幾何定義

  • 矩形 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) {
    // 中心點座標 ×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;
}
缺點:矩形碰撞為「包圍盒」近似,非矩形物體(如三角形、不規則精靈)會產生誤判(假陽性)。

二、圓形與圓形碰撞

幾何定義

  • 圓 1:中心 (x1, y1)、半徑 r1
  • 圓 2:中心 (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;
}
優點:精確、運算極快、無浮點需求。
適用:子彈、圓形敵人、圓形道具、角色近似圓形碰撞體。

三、進階應用:組合碰撞體

複雜物體(如飛機、人型角色)可拆解為多個基礎形狀組合:

  • 飛機:機身(矩形) + 機翼(兩矩形) + 駕駛艙(圓形)
  • 偵測流程:
    1. 廣義階段:用單一大包圍矩形/圓形快速剔除不可能碰撞對
    2. 狹義階段:逐一檢測子形狀碰撞,任一成立即判定碰撞

四、效能優化建議

  • 避免在碰撞迴圈中建立物件(new Rectangle() 等),使用基本型別參數
  • 空間分割:網格/四叉樹減少配對檢測數量(大量物體時必要)
  • 早期剔除:先檢測包圍盒重疊,再進入精確檢測
  • 固定時間步進:物理/碰撞邏輯與渲染分離,保證確定性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved