碰撞检测 - 小问题

时间:2010-11-15 20:19:19

标签: xna

此刻,它会移除1或2颗小行星,但不会出现在屏幕上的所有小行星,我认为这种方法存在缺陷,但我不确定是什么......

    public void CollisionDetection()
    {
        for (int i = 0; i < ship.bullets.Count; i++)
        {
            Rectangle shipRectangle = new
     

矩形((int)的ship.ShipPosition.X,   (INT)ship.ShipPosition.Y,                       shipTexture.Width,shipTexture.Height);

            for (j = 0; j < asteroidPositions.Count; j++)
            {
                asteroidRectangle = new Rectangle((int)asteroidPositions[j].X,
     

(int)的asteroidPositions [j]的.Y,                           asteroidTexture.Width,   asteroidTexture.Height);

                Vector2 position1 = asteroidPositions[j];
                Vector2 position2 = ship.bullets[i];

                float Cathetus1 = Math.Abs(position1.X - position2.X);
                float Cathetus2 = Math.Abs(position1.Y - position2.Y);

                Cathetus1 *= Cathetus1;
                Cathetus2 *= Cathetus2;

                distance = (float)Math.Sqrt(Cathetus1 +
     

Cathetus2);

                if ((int)distance < asteroidTexture.Width)
                {
                    score += 20;
                    asteroidPositions.RemoveAt(j);
                    j--;
                }
             }
                if (shipRectangle.Intersects(asteroidRectangle))
                {
                    lives--;
                    asteroidPositions.RemoveAt(j);
                }

            if (lives == 0)
                Exit();
        }

1 个答案:

答案 0 :(得分:1)

我认为你错了一些代码。您应该在距离比较期间分离X轴和Y轴,如果Y距离小于宽度并且 X距离小于高度而不是碰撞。

我认为位置是对象的中间,否则算法会复杂得多。我还假设子弹几乎没有大小,x.axis是宽度,y.axis是高度。 没有看到其余的代码很难说; - )

我的建议:

                Vector2 asteroidPosition = asteroidPositions[j];
                Vector2 shipPosotion = ship.bullets[i];

                float distanceX = Math.Abs(asteroidPosition.X - shipPosotion.X);
                float distanceY = Math.Abs(asteroidPosition.Y - shipPosotion.Y);

                if ((int)distanceX < asteroidTexture.Width and (int)distanceY < asteroidTexture.Height )
                {
                    score += 20;
                    asteroidPositions.RemoveAt(j);
                    j--;
                }

这段代码根本没有经过测试,我甚至不知道这实际上是哪种语言。所以只需把它作为灵感。希望它会成功。

P.S。:如果你有兴趣,我可以给你发一些我之前做过的小行星射击游戏的源代码来研究它......