我有一个简单的BreakOut游戏(垂直,底部划桨)启动并运行,但碰撞检测有点偏。 我使用的是Rectangle.Intersect最初检查球相交定的块在所有,然后如果它有4个相交调用,检查是否球是垂直碰撞(砖的一边,左+右)或水平(砖的顶部+底部)。 在某些情况下,当球在两个水平相邻的砖的交叉点附近以锐角碰撞砖时,它将两者都移除并继续向上的方向。我认为这是碰撞的两倍。我强行退出了foreach循环,它在找到矩形时检查矩形是否相交,但这还没有解决问题。
这是游戏类的主要Update()函数:
foreach (Brick brick in bricks)
{
if (brick.CheckCollision(ball))
{
break;
}
}
这是Brick.CheckCollision()函数:
public bool CheckCollision(Ball ball)
{
if (alive && ball.Bounds.Intersects(location))
{
alive=false;
ball.Deflection(this);
return true;
}
return false;
}
这是Ball.Deflection()函数。在这里,我使用没有宽度/高度的矩形来标记砖的两侧。不确定这是否正确:
public void Deflection(Brick brick)
{
//For vertical collision (top or bottom of brick) invert Y motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, brick.Location.Right - brick.Location.Left, 0)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Bottom, brick.Location.Right - brick.Location.Left, 0)))
{
motion.Y *= -1;
return;
}
//For horizontal collision (left or right side of brick) invert X motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Right, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)))
{
motion.X *= -1;
return;
}
}
我认为我犯了一个明显的逻辑错误,但如果一般的方法可以改进,我就全都听见了!