getWidth()/getHeight() 矩形是否相交。效率高、實現簡單,但非矩形精靈易產生誤判 (透明區重疊也視為碰撞)。改進折衷:縮小碰撞矩形減少誤判,但可能漏報邊緣碰撞。
Sprite 類提供三種 collidesWith 方法:
collidesWith(Sprite s, boolean pixelLevel):精靈間碰撞,pixelLevel=true 啟用像素級。collidesWith(Image img, int x, int y, boolean pixelLevel):精靈與圖像碰撞。collidesWith(TiledLayer layer, boolean pixelLevel):精靈與平鋪圖層 (如迷宮牆壁) 碰撞。
// 玩家子彈擊中敵機
for (int i = 0; i < MAX_SHOT; i++) {
for (int j = 0; j < MAX_ENEMY; j++) {
if (playerShot[i].isVisible() &&
playerShot[i].collidesWith(enemyShip[j], true)) { // 像素級
// 碰撞處理:加分、敵機爆炸、子彈消失...
}
}
}
// 玩家與小飛機碰撞
for (int i = 0; i < MAX_SMALL_PLANE; i++) {
if (smallPlane[i].isVisible() &&
smallPlane[i].collidesWith(playerSprite, true)) {
// 玩家扣血、重生...
}
}
| 場景 | 建議 |
|---|---|
| 大量簡單精靈 (子彈、方塊) | 矩形檢測 (false),效能優先 |
| 不規則造型、核心碰撞邏輯 (主角、Boss) | 像素級 (true),精確度優先 |
| 平台跳躍、迷宮邊界 | TiledLayer 碰撞 |