2012-07-17 27 views
1

因此,我的碰撞檢測系統設置爲檢查字符的每個像素,標記collisionDetected,將違規字符模型的像素置於collisionDetectedX和collisionDetectedY中。它使用這些數據來確定有效的可移動區域的位置,並將該單元推回到其中。解決此問題的唯一方法是讓X和Y的碰撞類同時運行,還是可以修改此類以便同時正確執行兩個作業?謝謝你的時間,我一直在努力弄清楚我做錯了什麼。我爲草率代碼道歉。我把它清理了一下(這真的很糟糕),但我意識到這不是最終產品的價值。2D碰撞檢測系統在對角移動時沒有反應

class Collision 
{   
    public Color[,] DataMiner(Texture2D background) 
    { 
     Color[,] collision2D; 
     Color[] collision1D; 
     collision1D = new Color[background.Width * background.Height]; 
     background.GetData(collision1D); 
     collision2D = new Color[background.Width, background.Height]; 
     for (int x = 0; x < background.Width; x++) 
      for (int y = 0; y < background.Height; y++) 
       collision2D[x, y] = collision1D[x + y * background.Width]; 
     return collision2D; 
    } 
    public void CollisionChecker(Color[,] background, ref Vector2 position) 
    { 
     Rectangle character; 
     character.Width = 32; 
     character.Height = 32; 
     character.X = Convert.ToInt16(position.X); 
     character.Y = Convert.ToInt16(position.Y); 
     int n = 0; 
     int n2 = 0; 
     bool collisionDetected = false; 
     int collisionDetectedX = 0; 
     int collisionDetectedY = 0; 
     while (n2 < character.Width) 
     { 
      n = 0; 
      while (n < character.Height) 
      { 
       if (background[character.X + n2, character.Y + n] == Color.Black) 
       { 
        collisionDetected = true; 
        collisionDetectedX = n2; 
        collisionDetectedY = n; 
       } 
       n++; 
      } 
      n2++; 
     } 
     if (collisionDetected == true) 
     { 
      collisionDetectedX += Convert.ToInt16(position.X); 
      collisionDetectedY += Convert.ToInt16(position.Y); 
      if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red) 
       position.Y += 1; 
      else if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red) 
       position.Y -= 1; 
      else if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red) 
       position.X += 1; 
      else if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red) 
       position.X -= 1; 
      else if (background[collisionDetectedX - 2, collisionDetectedY - 2] == Color.Red) 
      { 
       position.X -= 1; 
       position.Y -= 1; 
      } 
      else if (background[collisionDetectedX - 2, collisionDetectedY + 2] == Color.Red) 
      { 
       position.X -= 1; 
       position.Y += 1; 
      } 
      else if (background[collisionDetectedX + 2, collisionDetectedY - 2] == Color.Red) 
      { 
       position.X += 1; 
       position.Y -= 1; 
      } 
      else if (background[collisionDetectedX + 2, collisionDetectedY + 2] == Color.Red) 
      { 
       position.X += 1; 
       position.Y += 1; 
      } 
      collisionDetected = false; 
     } 

    } 
    public void Update(Texture2D background, ref Vector2 position) 
    { 
     CollisionChecker(DataMiner(background), ref position); 
    } 


} 

嗯,我沒有10代表尚未所以我不能回答我的問題,但我想通了:

我改變了if語句有點條件。我不得不刪除其他的,因爲當它發現一個需要改變的時候,它會放下嵌套if的其餘部分。既然它是在解決這個問題之後馬上做所有的事情,那麼當它靠近一個角落時,它會在平坦的牆壁上向右或向左「滑」。我添加了條件來檢查collisionDetected是否仍然爲true,並使每次更改都將其還原爲false。

祝您有個美好的一天,希望有人能從我的錯誤中學習!

 if (collisionDetected == true) 
     { 
      collisionDetectedX += Convert.ToInt16(position.X); 
      collisionDetectedY += Convert.ToInt16(position.Y); 
      if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red && collisionDetected) 
      { 
       position.Y += 1; 
       collisionDetected = false; 
      } 
      if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red && collisionDetected) 
      { 
       position.Y -= 1; 
       collisionDetected = false; 
      } 
      if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red && collisionDetected) 
      { 
       position.X += 1; 
       collisionDetected = false; 
      } 
      if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red && collisionDetected) 
      { 
       position.X -= 1; 
       collisionDetected = false; 
      } 

}

+0

http://gamedev.stackexchange.com/questions/27228/pixel-collision-detecting-corners – Cyral 2012-07-17 21:09:40

+0

也許這可以幫助:http://gamedev.stackexchange.com/questions/22118/how-can-i-使用矩形相交到解決-碰撞功能於XNA – EnemyArea 2012-07-18 09:25:27

回答