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

J2ME 遊戲碰撞偵測:矩形與圓形基礎演算法

     編輯:J2EE

前言

遊戲開發中,碰撞偵測是核心邏輯之一:判斷子彈是否擊中敵機、角色是否撞牆、道具是否被拾取,本質皆為「兩物體是否重疊」。真實物體形狀往往複雜,實務上常將其分解為基本幾何形狀(矩形、圓形)組合,分別偵測再綜合判斷。

1. 矩形與矩形碰撞

規則物體常近似為矩形。假設矩形 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;
}

此法簡單快速,但對非矩形物體精度較低。

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;
}

進階考量

  • 組合碰撞:複雜物體拆解為多個矩形/圓形,逐一檢測。
  • 廣義碰撞:矩形-圓形、多邊形、像素級碰撞等需更進階演算法(如 SAT 分離軸定理)。
  • 效能優化:使用空間分割(QuadTree、Grid)減少檢測對數;先以包圍盒快速剔除。

掌握基礎碰撞演算法後,可根據遊戲類型選擇適合的精度與效能平衡點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved