2013-08-17 112 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;