遊戲幀循環中,**廣義檢測 (Broad Phase) → 窄相檢測** 兩級過濾:
// 1. 頂點包含法 (最慢,分支多)
boolean collide1(Rect a, Rect b) {
return contains(a, b.x, b.y) || contains(a, b.x+b.w, b.y)
|| contains(a, b.x, b.y+b.h) || contains(a, b.x+b.w, b.y+b.h);
}
// 2. 分離軸法 (標準,無分支)
boolean collide2(Rect a, Rect b) {
return !(a.y > b.y + b.h || b.y > a.y + a.h
|| a.x > b.x + b.w || b.x > a.x + a.w);
}
// 3. 中心距離法 (適合正方形/近似圓)
boolean collide3(Rect a, Rect b) {
int dx = (a.x + a.w/2) - (b.x + b.w/2);
int dy = (a.y + a.h/2) - (b.y + b.h/2);
int rSum = (Math.max(a.w, a.h) + Math.max(b.w, b.h)) / 2;
return dx*dx + dy*dy < rSum*rSum;
}
// 4. 頂點編碼法 (最快,預計算 min/max)
boolean collide4(int[] r1, int[] r2) { // r=[xMin,yMin,xMax,yMax]
return !(r1[0] > r2[2] || r1[2] < r2[0] || r1[1] > r2[3] || r1[3] < r2[1]);
}
推薦 collide2 或 collide4:分支預測友好、指令少、無除法/開方。
boolean circleCollide(int x1, int y1, int r1, int x2, int y2, int r2) {
int dx = x1 - x2, dy = y1 - y2;
int rSum = r1 + r2;
return dx*dx + dy*dy <= rSum*rSum;
}
// Sprite 自帶方法:pixelLevel=true 僅檢測非透明像素重疊
boolean hit = spriteA.collidesWith(spriteB, true); // true=像素級, false=矩形級
// 注意:像素級極耗 CPU,僅在極少數關鍵對象 (主角 vs Boss) 使用。
現象:子彈速度極快,幀間位移 > 目標厚度,導致單幀檢測錯過碰撞。
// 計算時間區間 [tEntry, tExit] 內兩 AABB 重疊
// 參考:https://www.gamedev.net/tutorials/2d-game-physics/swept-aabb-collision-detection-and-response-r3084/
// 返回碰撞時間 t ∈ [0,1] 與法線
SweptResult sweptAABB(Rect a, Vec2 va, Rect b, Vec2 vb) { ... }
int steps = Math.max(Math.abs(vx), Math.abs(vy)) / maxSize + 1;
for (int i=0; i
子彈發射時刻發射射線 (x, y) + t*(vx, vy),計算與最近障礙物交點,直接定位碰撞位置與時間。
| 類型 | 典型遊戲 | 處理邏輯 |
|---|---|---|
| 彈開 | 打磚塊、彈球 | 反射速度向量:v = reflect(v, normal) |
| 停滯/滑動 | RPG、ACT | 位移修正至邊界,切向分量保留 |
| 觸發事件 | 拾取道具、觸發劇情 | 標記觸發、延遲一幀執行腳本 |
| 傷害/擊退 | ACT、STG | 扣血、添加擊退向量、無敵幀 |
Rect/Point/Vec2 復用,避免 GC 抖動。dx*dx 可接受,避免 Math.sqrt、Math.atan2。int[] mask,位運算 & 判斷像素重疊,比 Sprite.collidesWith(true) 快 3~5 倍。while (accumulator >= FIXED_DT) { update(FIXED_DT); accumulator -= FIXED_DT; } 確保物理穩定。J2ME 時代的碰撞檢測在 **無浮點運算單元 (FPU)、CPU 10~50 MHz、Heap < 500 KB** 的極限下,逼出了**定點數學、位運算技巧、對象池、定時步長**等工程智慧,這些技術在現代 **WebAssembly 物理引擎、嵌入式遊戲機 (Arduboy/Pokitto)、IoT 邊緣推理** 中依然閃光。