碰撞檢測(Collision Detection)判斷兩個遊戲精靈是否發生物理重疊。在射擊遊戲中:玩家精靈與敵機碰撞 → 扣血;子彈擊中敵機 → 加分銷毀。檢測精度直接影響遊戲體驗與公平性。
| 策略 | 原理 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 矩形邊界檢測 | 比較兩精靈外接矩形是否相交 | 極快,僅需 4 次座標比較 | 精靈非矩形時誤判率高(透明區域重疊也判定碰撞) | 規則矩形物體、原型驗證 |
| 縮小矩形檢測 | 以精靈實際圖像範圍為基礎縮小碰撞矩形 | 減少誤判,速度仍快 | 可能漏判邊緣實際重疊;需手動調整縮放比例 | 近似矩形精靈、效能敏感遊戲 |
| 像素級檢測 | 逐像素比較兩精靈非透明像素是否重疊 | 完美精準,任意形狀皆適用 | 計算量大,可能影響幀率 | 高精度需求、最終發布版本 |
javax.microedition.lcdui.game.Sprite 類提供 collidesWith() 方法:
// 精靈間碰撞,pixelLevel=true 為像素級,false 為矩形
boolean hit = sprite1.collidesWith(sprite2, true);
// 精靈與圖像碰撞,需指定圖像左上角座標
boolean hit = sprite.collidesWith(image, imgX, imgY, true);
// 精靈與 TiledLayer 碰撞(如迷宮牆壁)
boolean hit = sprite.collidesWith(tiledLayer, true);
/* 判斷敵機是否被玩家子彈擊中 */
for (int i = 0; i < MAX_SHOT; i++) {
if (!playerShot[i].isVisible()) continue;
for (int j = 0; j < MAX_ENEMY; j++) {
if (!enemyShip[j].isVisible()) continue;
if (playerShot[i].collidesWith(enemyShip[j], true)) {
// 碰撞處理:爆炸特效、加分、銷毀子彈與敵機
handleHit(playerShot[i], enemyShip[j]);
}
}
}
/* 檢測玩家是否與小飛機相撞 */
for (int i = 0; i < MAX_SMALL_PLANE; i++) {
if (smallPlane[i].isVisible() &&
smallPlane[i].collidesWith(playerSprite, true)) {
// 玩家扣血、閃爍無敵、重生邏輯
handlePlayerCrash(smallPlane[i]);
}
}
isVisible() 為 false 的精靈直接跳過。
圖示展示矩形邊界重疊判定邏輯,紅框為精靈外接矩形,重疊區域即判定為碰撞。