2010-11-15 90 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