1
        foreach (var rect in listRect)
        {
            foreach (var rect2 in listRect)
            {
                if (Rectangle.Intersect(rect.r,rect2.r) != Rectangle.Empty && rect != rect2)
                {
                    if (rect.r.Left < rect2.r.Right) 
                        rect.speedX = ran.Next(-6,-4);
                        rect2.speedX = ran.Next(4, 6);

                    if (rect.r.Right > rect2.r.Left)
                        rect.speedX = ran.Next(4, 6);
                        rect2.speedX = ran.Next(-6, -4);

                    if (rect.r.Top < rect2.r.Bottom)
                        rect.speedY = ran.Next(4, 6);
                        rect2.speedY = ran.Next(-6, -4);

                    if (rect.r.Bottom > rect2.r.Top)
                        rect.speedY = ran.Next(-6, -4);
                        rect2.speedY = ran.Next(4, 6);

これは、2 つの長方形が衝突したかどうかを確認する関数の現在のコードです。次に、衝突が検出された場合、長方形の速度を逆にして、反対方向に移動することになっています。

おそらく想像できるように、私のコードは機能せず、これをどのように解決する必要があるのか​​ 本当にわかりません。

長方形は listRect というリストに保存され、長方形のクラスは次のようになります。

class myRectangle
{
    public Rectangle r = new Rectangle();
    public int speedX = 5;
    public int speedY = 5;
}

簡単な衝突検出を行うにはどうすれば衝突した場所がわかるので、if-else ステートメントでそれをどのように使用できますか?

4

3 に答える 3

1

まず、例によって、最初に他のものと比較する必要があります

for(int first=0; first<listRect.Count;first++)
{
    for(int second=first+1;second<listRect.Count;second++)
    {
    }
}

次のステップでは、位置の長方形を確認する必要があります

if(listRect[first].r.X<listRect[second].r.X)
{
   if(listRect[first].r.Right > listRect[second].r.Left)
   {
       listRect[first].speedX = ran.Next(-6,-4);
       listRect[second].speedX = ran.Next(4, 6);
   }
}
else
{
    if(listRect[first].r.Left < listRect[second].r.Right)
    {
       listRect[first].speedX = ran.Next(4, 6);
       listRect[second].speedX = ran.Next(-6,-4);
    }
}

上下についても同様です。

于 2013-10-21T08:02:19.750 に答える
0

要素の左を別の要素の右と比較するべきではないと思います。次のコードを検討してください。

                if (rect.r.Left < rect2.r.Left) 
                    rect.speedX = ran.Next(-6,-4);
                    rect2.speedX = ran.Next(4, 6);

                if (rect.r.Left > rect2.r.Left)
                    rect.speedX = ran.Next(4, 6);
                    rect2.speedX = ran.Next(-6, -4);

                if (rect.r.Top < rect2.r.Top)
                    rect.speedY = ran.Next(4, 6);
                    rect2.speedY = ran.Next(-6, -4);

                if (rect.r.Top > rect2.r.Top)
                    rect.speedY = ran.Next(-6, -4);
                    rect2.speedY = ran.Next(4, 6);

どの長方形が各長方形のどちら側にあるかを知る必要があるだけです。また、これを行うことをお勧めします:

                    rect.speedX = -1 * rect.speedX;
                    rect2.speedY = -1 * rect.speedY;

どの長方形が他の長方形と比べてどこにあるかを確認しても、衝突側は表示されません。

于 2013-10-21T08:19:18.037 に答える
0

では、rectangle.intersect を使用するのはどうでしょうか。これには必要な機能があり、コーディングを節約できると思います..

次のように使用できます。

if (Rect.r.IntersectsWith(rect2.r))
                {
                    if (rect.r.Left < rect2.r.Left) 
                        rect.speedX = ran.Next(-6,-4);
                        rect2.speedX = ran.Next(4, 6);

                    if (rect.r.Left > rect2.r.Left)
                        rect.speedX = ran.Next(4, 6);
                        rect2.speedX = ran.Next(-6, -4);

                    if (rect.r.Top < rect2.r.Top)
                        rect.speedY = ran.Next(4, 6);
                        rect2.speedY = ran.Next(-6, -4);

                    if (rect.r.Top > rect2.r.Top)
                        rect.speedY = ran.Next(-6, -4);
                        rect2.speedY = ran.Next(4, 6);
                }

ドキュメントはmsdnにあります。

編集:速度を変更するには、左から左、上から上 (または右から右、下から下など) を比較する必要があります。コードスニペットを編集しました。

于 2013-10-21T08:12:58.490 に答える