我正在做一個平臺遊戲,我已經看過不同的方式來添加沒有旋轉的基於瓦片的遊戲中的碰撞。但是我所看到的一切都假設,在發現碰撞之前,碰撞的物體在任何情況下都不會足夠快地通過另一個物體。我已經嘗試過使用Box2D和Farseer,但是它們過於複雜,在製作大量的瓷磚時運行得非常慢。我也嘗試使用二維凸面我自己的方法,但也跑得太慢了。那麼有沒有一種方法可以在沒有最高速度的情況下檢測碰撞,或者讓物品相互傳遞,而不是過於複雜,並且可以使用大量的瓦片?任何幫助深表感謝xna碰撞沒有最大速度
回答
你可以嘗試雙算法的方式,用一個簡單的算法首先deturmine如果對象「可能」發生了碰撞,如果如果是這樣,使用複雜的算法來看看他們發生衝突。
取決於對象及其移動和整個遊戲。如果你正在向子彈射擊某個障礙物,你可以計算子彈在子彈擊中前是否會與障礙物相交。你有職位,你可以計算他們之間的距離。所以你可以檢查碰撞和距離。
其他方式,如@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,因爲它完全沒有必要,而且它會導致殺手鐗。相反,用幾個邊界框或圓圈覆蓋物體。
例如,假定藍色圓圈爲碰撞區域,紅色圓圈爲精確碰撞區域。
聽起來不錯。有沒有人知道我可能會如何爲「如果他們真的碰撞」部分做出算法?我所有的瓷磚和角色都有矩形的碰撞盒。將較大的碰撞盒作爲盒子或圓圈會更有效嗎? – user2605114
箱子碰撞比圈快,我用圈子,因爲它更好地覆蓋物體。那麼你也可以計算反彈角度,比矩形更好地增加一些傷害效果。視覺上更加敏銳。當您使用方框和圓圈時,我添加了另一張圖片。相同的尺寸,你可以看到碰撞(藍色)更準確。 –
「將它們碰撞」,你可以使用只有一個像素(vector2)來計算,所以如果該像素的位置在其他對象內部,則會有一個chanse會混淆。如果它們真的發生混淆,則使用較慢的物體運動來計算碰撞。而不是velocity.x = 20在循環中使用velocity.y = 1。 –
- 1. XNA Pong碰撞
- 2. XNA中的碰撞
- 3. XNA碰撞檢測
- 4. XNA碰撞檢測
- 5. XNA多級碰撞
- 6. XNA碰撞檢測與遊戲速度對比
- 7. XNA-如何計算二維圓相互碰撞後的速度?
- 8. XNA二維碰撞檢測
- 9. Tilemap碰撞檢測C#XNA
- 10. XNA 4.0碰撞檢測
- 11. XNA 4.0 2d碰撞檢測
- 12. XNA碰撞檢測2D
- 13. 邊框碰撞XNA C#
- 14. XNA等距瓷磚碰撞
- 15. C#XNA精確碰撞?
- 16. 碰撞檢測 - 地精XNA
- 17. XNA瓷磚基於碰撞
- 18. Xna碰撞移動精靈
- 19. 邊界框碰撞-3D XNA
- 20. XNA碰撞怪異行爲
- 21. 球對球碰撞 - 在碰撞時獲得顯着的速度
- 22. pygame.sprite.spritecollideany沒有碰撞?
- 23. 使碰撞檢測更有效(C#XNA)
- 24. Pygame碰撞變速
- 25. 計算碰撞,考慮到速度
- 26. 彈性碰撞的速度閾值
- 27. Box2d力量和碰撞後的速度
- 28. Box2D的提升速度碰撞
- 29. 圓形碰撞後的新速度
- 30. XNA - 球碰撞檢測錯誤的第一次碰撞
每一個算法,你會發現/實施將對項目的數量限制,當你添加越來越多的對象運行緩慢 - 有什麼是你可以做的。這裏沒有什麼可說的,除了 - 設定目標,個人資料,並看看你的情況是什麼緩慢。在精確檢查之前添加基於空間位置的近似檢查(比如包含速度/時間的邊界矩形)以及某些分類對象是可能的方法來優化... –