2013-08-17 113 views
0

CollisionTest();并不像预期的。只有一个箱子的工作有冲突... 此代码可能会伤害你的眼睛,它可能是一个糟糕的方式做我想做我的碰撞列表不能按预期工作

Game1.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); 

GameObject.cs

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

回答

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; 
    } 
} 

它的工作只在最后一个框在列表中,因为你把所有箱子执行“其他”代码,已经检测到碰撞后还是一样。

比方说,你在检测到第一个框的碰撞。你执行你的“碰撞”代码。那么对于下一个盒子,你不会碰撞。你执行你的“不碰撞”代码。由于您将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;