此刻,它会移除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)
我认为你错了一些代码。您应该在距离比较期间分离X轴和Y轴,如果Y距离小于宽度并且 X距离小于高度而不是碰撞。
我认为位置是对象的中间,否则算法会复杂得多。我还假设子弹几乎没有大小,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。:如果你有兴趣,我可以给你发一些我之前做过的小行星射击游戏的源代码来研究它......