我正在構建在線遊戲的服務器端(!),我需要檢查子彈是否碰到目標。C++檢查2d向量是否碰到障礙物
客戶端發送給我的是子彈的位置和角度,我知道所有敵人的座標和大小。子彈射擊後如何計算子彈是否擊中敵人?敵人有不同的大小,子彈是1px大小。
例如,我有0,0座標45度的玩家拍攝角度,以及10個寬度,15高度的200,200座標的敵人。我如何計算子彈擊中敵人?
更新:該遊戲是從頂部2d射手,像Crimsonland。射彈的起步速度緩慢下降。
我正在構建在線遊戲的服務器端(!),我需要檢查子彈是否碰到目標。C++檢查2d向量是否碰到障礙物
客戶端發送給我的是子彈的位置和角度,我知道所有敵人的座標和大小。子彈射擊後如何計算子彈是否擊中敵人?敵人有不同的大小,子彈是1px大小。
例如,我有0,0座標45度的玩家拍攝角度,以及10個寬度,15高度的200,200座標的敵人。我如何計算子彈擊中敵人?
更新:該遊戲是從頂部2d射手,像Crimsonland。射彈的起步速度緩慢下降。
您應該看一下the power of a point。 它可以讓你知道線和點之間的最小距離。 因此,如果距離低於目標的寬度,這是一個命中!
最簡單的方法是檢查子彈是否在敵人的矩形內。如果是,處置子彈和敵人。
基本上是:
while(game.is_on()){
for(enemy = enemyCollection.begin(); enemy != enemyCollection.end(); ++enemy){
if(enemy.contains(bullet)){
enemy.dead();
bullet.hit();
}
}
如果您需要檢查線路是否相交的矩形,然後基於跨產品應用方位的測試 - 如果跨產品的標誌是所有矩形的頂點是相同的 - 線不交叉處, 。
線L0,L1,點P
Orientation = Cross(P - L0, L1 - L0)
(而不是L1-L0組件可以使用的Cos(FI)和仙拍攝角度(FI))
如果你需要得到交叉點,使用line clipping的一些算法 - 例如Liang-Barsky one。
它看起來不那麼容易。要獲得完整的解決方案,您需要沿着旅行路線擠出物體。然後你反對對象相交測試。
這很難,因爲任意路徑的任意形狀的擠壓都很難。因此,稍微欺騙一下會更容易。子彈可以沒有區域,所以它們只是線段。確保步長足夠低,線段相對較短。然後用相對較短的線再次製作船的矩形。現在,它有很多短線路交會測試。您可以使用planesweep算法快速完成這些任務。 planeweep的好處在於,您還可以將其擴展爲曲線或形狀,方法是返回可能的交點而不是實際的交點。
一旦你有一個子彈和船的碰撞矩形的交集,你可能需要運行一個時間步來檢查實際發生的命中,而不是一個狹窄的未命中。您也可以確定該點擊是在前面,左邊,右邊還是後面。
我沒有讀過任何東西,但我確信有關於該問題的完整書籍 – user463035818
簡而言之:對於每個物體,您需要檢查它在什麼位置會擊中子彈。首先擊中子彈的物體是真正擊中它的物體。爲了避免對每個對象進行計算,可以使用邊界框來非常快速地檢測非碰撞 – user463035818
射彈是如何建模的?瞬間[hitscan](https://en.wikipedia.org/wiki/Hitscan)?有限速度?這是自上而下的嗎?與重力的側視圖?現在你在「不清楚你問的問題」和「太寬泛」之間徘徊。 – genpfault