2016-08-16 9 views
1

私は自分の衝突システムをOpenTKの修正バージョンで策定しました。これは、ゲーム内のすべてのクワッドをチェックするループ(これは何かが動いたときに実行される)をチェックし、最後のフレームの位置、つまりこのフレームと交差する位置に戻すループを実行することによって機能します。私はそれをよく説明していないかもしれないので、ここでは、プレーヤーが右に動くときに呼び出されるSetXVelocityコードです。ここで衝突が特定のクワッドをスキップしています

public void SetXVelocity(float x) 
     { 
      foreach (Quad quad in quads) 
      { 
       if (!quad.Equals(this)) 
       { 
        if (Intersects(quad)) 
        { 
         Velocity.x = 0; 
         Position = OldPosition; 
         continue; 
        } 
        if (!Intersects(quad)) 
        { 
         OldPosition = Position; 
         Velocity.x = x; 
         continue; 
        } 
       } 
       else 
       { 
        OldPosition = Position; 
        continue; 
       } 
       OldPosition = Position; 
       continue; 
      } 
     } 

Intersectsのコードです:

public bool Intersects(Quad quad) 
     { 
      #region 
      if (TLCorner.x > quad.TLCorner.x && TLCorner.x < quad.BRCorner.x && TLCorner.y < quad.TLCorner.y && TLCorner.y > quad.BRCorner.y) 
      { 
       return true; 
      } 
      if (BRCorner.x < quad.BRCorner.x && BRCorner.x > quad.TLCorner.x && BRCorner.y > quad.BRCorner.y && BRCorner.y < quad.TLCorner.y) 
      { 
       return true; 
      } 
      if (TRCorner.x < quad.TRCorner.x && TRCorner.x > quad.BLCorner.x && TRCorner.y < quad.TRCorner.y && TRCorner.y > quad.BLCorner.y) 
      { 
       return true; 
      } 
      if (BLCorner.x > quad.BLCorner.x && BLCorner.x < quad.TRCorner.x && BLCorner.y > quad.BLCorner.y && BLCorner.y < quad.TRCorner.y) 
      { 
       return true; 
      } 
      #endregion // Corner Intersection 
      if (Math.Round(Left, 2) == Math.Round(quad.Right, 2) && TRCorner.y > quad.TRCorner.y && BRCorner.y < quad.BRCorner.y) 
       return true; 
      if (Math.Round(Right, 2) == Math.Round(quad.Left, 2) && TRCorner.y > quad.TRCorner.y && BRCorner.y < quad.BRCorner.y) 
       return true; 
      return false; 
     } 

ところで、TRCornerはキープ、コードの

最後のブロックはQuadクラスであるなど、右上を表すのVector3です実際のクラスは巨大なので、すべてを含めないようにしてください:

public Vector3 Velocity; 
public Vector3 Position; 
public int Index; 
public VBO<Vector3> VertexData 
    { 
     get; 
     set; 
    } 
    public VBO<int> VertexCount 
    { 
     get; 
     set; 
    } 
    public VBO<Vector2> VertexTexture 
    { 
     get; 
     set; 
    } 

何らかの理由で、いくつかのクワッドには衝突がなく、いくつかのクワッドには衝突がありません。いくつかは、プレーヤーがそれらに固執する衝突を持っています。

+1

それをテストすることができhttps://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection

をしかし、せいぜいあなたの交差点のコードはあまりに複雑に見えます。 2つの長方形が重なり合っているかどうかを調べるのに4回の比較が必要で、私はあなたのコードで22回の比較を数えました。自分で論理を引き出すことに問題がある場合は、オンラインでコードを見つけるのは難しいことではありません。それについて考え始めるのはかなり簡単です。ヒント:少なくとも私にとっては、四角形が重なり合わない4つの条件を書き留めて、論理式を否定するほうが簡単です。 –

+0

ええと...あなたは、今私はそれを実現させました。私はこれを後でやっていきますが、それが過度に複雑であっても、なぜこれがうまくいかないのかを知りたいのです。現実には、私はOpenGLを使ってゲームエンジンを設計していますが、ここのコードはVSでのものから多く**簡単になっています。 @RetoKoradiのコメントに感謝します。 –

+0

このような簡単な試みhttps://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection Playerはあなたが '>'と '<'を使用するため、衝突をチェックするまでに長方形は互いに内側にあり、永遠に衝突します。 – Harish

答えて

0

あなたの比較ではすべての条件がカバーされていないため、いくつかの四角形が欠けていると思います。

&&すべての条件のため、検出するためにはすべての条件を満たす必要があります。

if (TLCorner.x > quad.TLCorner.x && TLCorner.x < quad.BRCorner.x && TLCorner.y < quad.TLCorner.y && TLCorner.y > quad.BRCorner.y) 
     { 
      return true; 
     } 

if(TLCorner.x == quad.TLCorner.x && TLCorner.y < quad.TLCorner.y && TLCorner.y > quad.BRCorner.y)矩形はまだ衝突しますが、検出されません。

他の条件でも同じです。

すべての条件をカバーするには、コードに>=<=を使用します。

速度がお互いに行き詰まっている理由は、境界線が重なるときではなく、互いに衝突した後に衝突を検出するため、速度が永久に衝突する状態にプッシュされる可能性があります。

また、速度が逆転し、衝突が検出されたときに他の近くの長方形に詰まっていないように、速度を逆にすることもできます。

私は非常にあなたが衝突検出のために

リンクより良いロジックを使用することをお勧め:私はすべてを見て忍耐を持っていなかったあなたはここにhttp://jsfiddle.net/knam8/

+0

私は> =でリンク内のそのメソッドに切り替えましたが、それはまだ起こっています。 –

+0

私はあなたのコードに '> ='と '<='を示唆していましたが、リンクのコードには使用しないでください。あなたはここでそれをテストすることができますhttp://jsfiddle.net/knam8/ – Harish

+0

私は自分のPCに戻ってきたときにそれを与えるでしょう –

関連する問題