0

碰撞测试();不像预期的那样工作..只有一个盒子有碰撞......这段代码可能会伤害你的眼睛,它可能是做我想做的事情的坏方法

游戏1.cs

Texture2D boxTexture;
GameObject box, box1, box2;
List <GameObject> boxlist;
Random rand = new Random();

LoadContent()
   boxTexture = Content.Load<Texture2D>("box");
   for(int i = 0; i < boxlist.Count; i++)
            boxlist[i] = new GameObject(boxTexture, new Vector2(rand.Next(100, 1200), rand.Next(500, 600)));

Update()
    CollisionTest();

public void CollisionTest()
{

    for (int i = 0; i < boxlist.Count; i++)
    {
        if (player.collisionRect.Intersects(boxlist[i].collisionRect))
        {
            ground.Y = boxlist[i].collisionRect.Y;
            player.setPositionY(0);
        }
        else
        {
            ground.Y = 640;
       }
    }

}

Draw()
for (int i = 0; i < boxlist.Count; i++)
    boxlist[i].Draw(spriteBatch);

游戏对象.cs

public Rectangle collisionRect
{
    get
    {
        return new Rectangle((int)position.X, (int)position.Y, texture.Width, texture.Height);
    }
}
4

1 回答 1

0

问题在这里:

for (int i = 0; i < boxlist.Count; i++)
{
    if (player.collisionRect.Intersects(boxlist[i].collisionRect))
    {
        ground.Y = boxlist[i].collisionRect.Y;
        player.setPositionY(0);
    }
    else
    {
        ground.Y = 640;
    }
}

它只对列表中的最后一个框起作用,因为即使在检测到碰撞之后,您也会继续在所有框上执行“else”代码。

假设您在第一个盒子上检测到碰撞。您执行“碰撞时”代码。然后对于下一个盒子,你不会碰撞。您执行“无冲突”代码。由于您ground.Y为两种条件设置了不同的值,因此您只会看到最后一次检查的结果。

正确的方法是这样的:

bool collided = false;
for (int i = 0; i < boxlist.Count; i++)
{
    if (player.collisionRect.Intersects(boxlist[i].collisionRect))
    {
        ground.Y = boxlist[i].collisionRect.Y;
        player.setPositionY(0);
        collided = true;
        //break; //If you want to only handle one collision you can uncomment this
    }
}
if (!collided)
    ground.Y = 640;
于 2013-08-17T01:35:45.390 回答