私は自分の衝突システムを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;
}
何らかの理由で、いくつかのクワッドには衝突がなく、いくつかのクワッドには衝突がありません。いくつかは、プレーヤーがそれらに固執する衝突を持っています。
それをテストすることができhttps://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection
をしかし、せいぜいあなたの交差点のコードはあまりに複雑に見えます。 2つの長方形が重なり合っているかどうかを調べるのに4回の比較が必要で、私はあなたのコードで22回の比較を数えました。自分で論理を引き出すことに問題がある場合は、オンラインでコードを見つけるのは難しいことではありません。それについて考え始めるのはかなり簡単です。ヒント:少なくとも私にとっては、四角形が重なり合わない4つの条件を書き留めて、論理式を否定するほうが簡単です。 –
ええと...あなたは、今私はそれを実現させました。私はこれを後でやっていきますが、それが過度に複雑であっても、なぜこれがうまくいかないのかを知りたいのです。現実には、私はOpenGLを使ってゲームエンジンを設計していますが、ここのコードはVSでのものから多く**簡単になっています。 @RetoKoradiのコメントに感謝します。 –
このような簡単な試みhttps://developer.mozilla.org/en-US/docs/Games/Techniques/2D_collision_detection Playerはあなたが '>'と '<'を使用するため、衝突をチェックするまでに長方形は互いに内側にあり、永遠に衝突します。 – Harish