2012-03-23 53 views
2

在Android中,我使用SurfaceView來顯示簡單的2D遊戲。位圖(.png) alpha(代表遊戲對象)繪製在畫布上。在Android的SurfaceView的畫布上使用位圖進行碰撞檢測

現在我想做一個簡單而準確的碰撞檢測。檢查這些位圖是否重疊很容易。

但是,當這些位圖有透明區域時,如何檢查碰撞?我的挑戰是檢測兩個球是否碰撞。它們在寬度和高度上填充整個位圖,但是在所有四個邊緣中,當然有透明區域,因爲它是方形中的圓形。

只有當球真的相撞,而不是他們周圍的位圖框時,檢測那裏碰撞的最簡單方法是什麼?

我是否必須儘可能在球的輪廓上存儲儘可能多的點的座標?或者Android在檢查碰撞時是否可以「忽略」alpha通道?

回答

7

如果是碰撞球,您可以執行分析性碰撞檢測 - 每像素檢測會更快。你只需要有兩個中心球(x1,y1)和(x2,y2),第一個球的半徑r1,第二個球的r2。現在,如果球中心之間的距離小於或等於半徑的總和,則球碰撞:

colide = sqrt((x1-x2)^2+(y1-y2)^2)<=r1+r2 

但快一點的方法是比較這個數值的平方:

colide = (x1-x2)^2+(y1-y2)^2<=(r1+r2)^2 
+1

非常感謝!對於球例如,這可能是完美的解決方案。我應該提到我希望能有更通用的解決方案(例如,按像素檢測),但這是我的錯。 – caw 2012-03-24 13:53:22

2

這是多少更容易使用像AndEngine現有的庫,而不是重新發明輪子。但我不確定它是否可以與SurfaceView一起使用。檢查這篇文章:Pixel Perfect Collision Detection for AndEngine

+0

謝謝,因爲我不想使用精靈,它可能是使用部分代碼的最佳方法,對吧?這是否是重要的部分? https://github.com/m5/andengine-pixel-perfect/blob/master/src/com/qwerjk/andengine/collision/PixelPerfectBitMask.java並沒有任何可能性檢查每個像素的位圖顏色?我可以檢查真正顏色的位置(不是alpha),並以這種方式確定真實對象的輪廓。 – caw 2012-03-28 17:14:56

9

我能想到的另一種方法可以用可以使用Path s構建的簡單對象來工作。

一旦你有兩個對象,其邊界由路徑來表示,可以試試這個:

Path path1 = new Path(); 
path1.addCircle(10, 10, 4, Path.Direction.CW); 
Path path2 = new Path(); 
path2.addCircle(15, 15, 8, Path.Direction.CW); 

Region region1 = new Region(); 
region1.setPath(path1, clip); 
Region region2 = new Region(); 
region2.setPath(path2, clip); 

if (!region1.quickReject(region2) && region1.op(region2, Region.Op.INTERSECT)) { 
    // Collision! 
} 

一旦你有你的對象爲路徑,就可以直接使用drawPath()吸引他們。您也可以通過路徑執行移動。

+1

謝謝,這是一個非圓形對象非常有趣和有用的解決方案!無論如何,我還沒有真正想出'剪輯'可能是什麼...... – caw 2012-04-03 00:30:45

+2

從我的理解,上面的代碼中的變量「剪輯」應該是路徑的邊界框。對於一般用途,我使用 Region clip = new Region(0,0,layoutWidth,layoutHeight); 佈局的寬度和高度可以是您的畫布或活動的大小或其他。 – 2012-11-19 09:11:48