2017-09-26 118 views
-2

我正在構建在線遊戲的服務器端(!),我需要檢查子彈是否碰到目標。C++檢查2d向量是否碰到障礙物

客戶端發送給我的是子彈的位置和角度,我知道所有敵人的座標和大小。子彈射擊後如何計算子彈是否擊中敵人?敵人有不同的大小,子彈是1px大小。

例如,我有0,0座標45度的玩家拍攝角度,以及10個寬度,15高度的200,200座標的敵人。我如何計算子彈擊中敵人?

更新:該遊戲是從頂部2d射手,像Crimsonland。射彈的起步速度緩慢下降。

+0

我沒有讀過任何東西,但我確信有關於該問題的完整書籍 – user463035818

+0

簡而言之:對於每個物體,您需要檢查它在什麼位置會擊中子彈。首先擊中子彈的物體是真正擊中它的物體。爲了避免對每個對象進行計算,可以使用邊界框來非常快速地檢測非碰撞 – user463035818

+3

射彈是如何建模的?瞬間[hitscan](https://en.wikipedia.org/wiki/Hitscan)?有限速度?這是自上而下的嗎?與重力的側視圖?現在你在「不清楚你問的問題」和「太寬泛」之間徘徊。 – genpfault

回答

1

您應該看一下the power of a point。 它可以讓你知道線和點之間的最小距離。 因此,如果距離低於目標的寬度,這是一個命中!

1

最簡單的方法是檢查子彈是否在敵人的矩形內。如果是,處置子彈和敵人。

基本上是:

while(game.is_on()){ 
    for(enemy = enemyCollection.begin(); enemy != enemyCollection.end(); ++enemy){ 
     if(enemy.contains(bullet)){ 
      enemy.dead(); 
      bullet.hit(); 
    } 
} 
+0

似乎是最好的解決方案,但如果我需要檢查哪個敵人方被子彈擊中?例如,如果子彈從後面擊中,這是從面部撞擊的另一種類型的傷害。 – MurDaD

+0

如果外環的時間步長足夠小,那麼在敵方的四邊中,靠近子彈的那一個是第一個是命中方。存在一些其他的極限情況,但它真的歸結爲在if內執行'enemy.dead()'和'bullet.hit()'的不同事情。 – bracco23

1

如果您需要檢查線路是否相交的矩形,然後基於跨產品應用方位的測試 - 如果跨產品的標誌是所有矩形的頂點是相同的 - 線不交叉處, 。

線L0,L1,點P

Orientation = Cross(P - L0, L1 - L0) 

(而不是L1-L0組件可以使用的Cos(FI)和仙拍攝角度(FI))

如果你需要得到交叉點,使用line clipping的一些算法 - 例如Liang-Barsky one。

1

它看起來不那麼容易。要獲得完整的解決方案,您需要沿着旅行路線擠出物體。然後你反對對象相交測試。

這很難,因爲任意路徑的任意形狀的擠壓都很難。因此,稍微欺騙一下會更容易。子彈可以沒有區域,所以它們只是線段。確保步長足夠低,線段相對較短。然後用相對較短的線再次製作船的矩形。現在,它有很多短線路交會測試。您可以使用planesweep算法快速完成這些任務。 planeweep的好處在於,您還可以將其擴展爲曲線或形狀,方法是返回可能的交點而不是實際的交點。

一旦你有一個子彈和船的碰撞矩形的交集,你可能需要運行一個時間步來檢查實際發生的命中,而不是一個狹窄的未命中。您也可以確定該點擊是在前面,左邊,右邊還是後面。