2017-09-26 4 views
-2

オンラインゲームのサーバーサイド(!)をビルドしています。弾丸がターゲットに当たっているかどうかを確認する必要があります。2dベクトルが障害物に当たったかどうかチェックする

クライアントは私に位置と弾丸の発射角度を送信、私はすべての敵の座標とサイズを知っています。弾丸が発射された後に弾丸が敵に当たったかどうかを計算するにはどうすればよいですか?敵はサイズが異なり、弾丸は1pxサイズです。

例えば、プレーヤーの撮影角度は0度、0度、敵は200、200度座標は10幅、15高さです。その弾丸が敵に当たるのをどのようにして計算するのですか?

更新日:ゲームはCrimsonlandのように上から2番目のドゥーサーです。発射体はゆっくりと減少する開始速度を有する。

+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

外側ループのタイムステップが十分に小さい場合、敵の4辺のうち弾丸に近いものがヒット側です。他にもいくつかの制限ケースがありますが、if内部の 'enemy.dead()'と 'bullet.hit()'のような異なることをするためには本当に煮詰まります。 – bracco23

1

あなたは外積に基づいてオリエンテーションテストを適用し、ラインが長方形と交差するかどうかを確認する必要がある場合 - 行がそれを交差しない - 外積の符号がすべての矩形の頂点で同じである場合。

ラインL0-L1は、点P

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

(代わりに、L1-L0のコンポーネントで使用すると、撮影角度のコス(FI)と罪(FI)を使用することができます)

あなたが取得する必要がある場合交点、line clippingのアルゴリズムを使用してください - 例えば、Liang-Barskyのアルゴリズムです。

1

見た目はそれほど簡単ではありません。完全な解決策を得るには、移動経路に沿ってオブジェクトを押し出す必要があります。次にオブジェクト交差テストを行うオブジェクトを作成します。

任意のパスで任意の形状を押し出すのは難しいので、難しいです。だから、ちょっと騙す方が簡単です。箇条書きは領域を持たないので、単なる線分です。ラインセグメントが比較的短くなるようにステップサイズが十分に小さいことを確認してください。次に、比較的短い線で船を長方形にする。現在は、線の交差テストのための短い線がたくさんあります。平面波アルゴリズムを使用すると、これらを素早く行うことができます。平面の波についての素晴らしい点は、実際の交差点ではなく交差点を返すことによって、カーブや図形にも拡張できることです。

弾丸と船の衝突矩形が交差したら、狭いミスではなく実際にヒットしたかどうかを確認するためにタイムステップを実行する必要があります。ヒットがこの時点で前、左、右、または後ろにあったかどうかを判断することもできます。

関連する問題