2014-05-01 43 views
0

我正在做一個平臺遊戲,我已經看過不同的方式來添加沒有旋轉的基於瓦片的遊戲中的碰撞。但是我所看到的一切都假設,在發現碰撞之前,碰撞的物體在任何情況下都不會足夠快地通過另一個物體。我已經嘗試過使用Box2D和Farseer,但是它們過於複雜,在製作大量的瓷磚時運行得非常慢。我也嘗試使用二維凸面我自己的方法,但也跑得太慢了。那麼有沒有一種方法可以在沒有最高速度的情況下檢測碰撞,或者讓物品相互傳遞,而不是過於複雜,並且可以使用大量的瓦片?任何幫助深表感謝xna碰撞沒有最大速度

+0

每一個算法,你會發現/實施將對項目的數量限制,當你添加越來越多的對象運行緩慢 - 有什麼是你可以做的。這裏沒有什麼可說的,除了 - 設定目標,個人資料,並看看你的情況是什麼緩慢。在精確檢查之前添加基於空間位置的近似檢查(比如包含速度/時間的邊界矩形)以及某些分類對象是可能的方法來優化... –

回答

0

你可以嘗試雙算法的方式,用一個簡單的算法首先deturmine如果對象「可能」發生了碰撞,如果如果是這樣,使用複雜的算法來看看他們發生衝突。

0

取決於對象及其移動和整個遊戲。如果你正在向子彈射擊某個障礙物,你可以計算子彈在子彈擊中前是否會與障礙物相交。你有職位,你可以計算他們之間的距離。所以你可以檢查碰撞和距離。

其他方式,如@cwohlman建議。你可以有2個碰撞盒,一個大的「假定」碰撞區域和一個覆蓋物體的excact。所以如果對象觸發器假設有碰撞,那麼你知道我有機會讓子彈擊中對象,並且你會做一些詳細的計算,如果按鈕會碰到對象或者會通過對象之上或之下。爲了確定物體是否處於假定的碰撞區域,您可以使用圓形圓圈。

private bool DetectCircularCollision(Sprite a, Sprite b) 
{ 
    float radius = Math.Sqrt(a.Width/2 * a.Height/2 + b.Width/2 * b.Height/2); 
    float distance = Vector2.Distance(a.Position, b.Position); 
    if (distance < radius) return true; 
    return false; 
} 

到目前爲止我沒有遇到這個問題,因爲所有的飛行物應該對玩家眼睛可見。如果你移動對象50px或100px每幀播放器不會注意到這一點,或將被弄糊塗這是什麼。

您可能需要結合少數碰撞方法來實現您所需的功能。建議,不要使用像素collsion,因爲它完全沒有必要,而且它會導致殺手鐗。相反,用幾個邊界框或圓圈覆蓋物體。

例如,假定藍色圓圈爲碰撞區域,紅色圓圈爲精確碰撞區域。

enter image description here enter image description here

+0

聽起來不錯。有沒有人知道我可能會如何爲「如果他們真的碰撞」部分做出算法?我所有的瓷磚和角色都有矩形的碰撞盒​​。將較大的碰撞盒作爲盒子或圓圈會更有效嗎? – user2605114

+0

箱子碰撞比圈快,我用圈子,因爲它更好地覆蓋物體。那麼你也可以計算反彈角度,比矩形更好地增加一些傷害效果。視覺上更加敏銳。當您使用方框和圓圈時,我添加了另一張圖片。相同的尺寸,你可以看到碰撞(藍色)更準確。 –

+0

「將它們碰撞」,你可以使用只有一個像素(vector2)來計算,所以如果該像素的位置在其他對象內部,則會有一個chanse會混淆。如果它們真的發生混淆,則使用較慢的物體運動來計算碰撞。而不是velocity.x = 20在循環中使用velocity.y = 1。 –