簡體   English   中英

2D Tile /基於時間的碰撞檢測

[英]2D Tile / Time based collision detection

我目前正在基於2D瓷磚地圖創建一款塔防游戲。

游戲循環基於HTML5-API requestAnimationFrame,因此我使用的是基於時間的動畫。

現在的問題是,如何才能有效地檢查碰撞? 如果增量太高,子彈可能會跳到敵人身后而不會觸發碰撞。 子彈和敵人各有不同的移動速度。

到目前為止,我發現的唯一可能的解決方案是實施“固定時間步長物理學”,感覺有些怪異。 還有其他解決方案嗎?

我想一些適合該主題的關鍵字/算法已經可以幫上很多忙!

在每個更新周期中,沿着子彈軌跡畫一條線。 還要為使用相同方法可能移動的任何目標畫一條線,如果這些線相交則發生碰撞(還要檢查固定目標)。

例如,將線的向量設置為子彈lastPosition到每個更新周期的子彈currentPosition ,測試該線段每個更新沿其路徑的碰撞次數。

以Matthew Pigram的答案為基礎:

除了繪制Lizzaran92所示的線並測試交點外,您還需要計算該幀內交點的“ 時間 ”,以避免錯誤的碰撞。

例如,假設兩條線都以線性速度行進,則如果線A相交於其線的50%,而線B相交於20%,那么它們很可能從未發生碰撞。 您可以設置一個閾值 ,彼此之間的偏差應在10%以內,以表示碰撞。

其他答案都指向正確的方向。 您可以使用直線相交方法。 在大多數情況下,這是令人發笑的,因為這種“錯誤碰撞”和實際碰撞之間的差異很小。 但是,如果您看到這似乎並不現實,那將是現實。 您可以使用交點。

您有2個對象,分別是速度,兩者的起點和終點。 有了這些信息,您可以:

  1. 計算交點。
  2. 計算起點和交叉點之間的距離(d²=(x1-x2)²+(y1-y2)²)。
  3. 將其除以您的速度,便可以得到到達交點的時間。
  4. 對其他對象執行相同的操作。
  5. 比較兩次,或者更好地建立差異並使用公差(因為對象也具有尺寸,您在計算中將其忽略):

如果差異較小,則您的容忍度發生了碰撞。

請注意,這可能會降低性能,因此僅在確實必要時才使用它!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM