碰撞检测 - 小问题
问题描述:
在分钟,它会删除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(); }
答
我觉得你有一些代码错误。在距离比较中,如果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:如果你有兴趣,我可以寄给你一些小行星的射击游戏,我做了前一段时间去研究它的源代码
建议您重命名位置1到asteoridPosition和位置2到shipPosition。为了更好的可读性...... – dStulle 2010-11-15 20:24:23
删除小行星后的j--是什么? – dStulle 2010-11-15 21:25:14