2010-11-15 91 views
3

在分鐘,它會刪除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(); 
     } 
+0

建議您重命名位置1到asteoridPosition和位置2到shipPosition。爲了更好的可讀性...... – dStulle 2010-11-15 20:24:23

+0

刪除小行星後的j--是什麼? – dStulle 2010-11-15 21:25:14

回答

1

我覺得你有一些代碼錯誤。在距離比較中,如果Y距離小於寬度,X距離比碰撞高度小,那麼您應該將X和Y軸分開。

我假設位置是對象的中間位置,否則算法會複雜得多。我也假定子彈幾乎沒有尺寸,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:如果你有興趣,我可以寄給你一些小行星的射擊遊戲,我做了前一段時間去研究它的源代碼

+0

它是Xna,所以C#...我實際上使用了其他遊戲教程中的類似代碼 – Joe 2010-11-15 21:02:33

+0

如果您使用圓形對象處理,也許您的碰撞代碼是完全錯誤的。也許問題在於AsteroidPositions對象的RemoveAt()方法中。 – dStulle 2010-11-15 21:10:58

+0

好吧,子彈有時會「超過」小行星,大概每隔一段時間它就會正確擊中並移除一顆小行星...... – Joe 2010-11-15 21:18:08