此代碼可能比你更需要全面,可以重構,以滿足您的需求,但它是一個完整的答案,是靈活的與移動一起移動邊界矩形使用界。
這裏是一個圖形來給出代碼正在做的事情的視覺幫助。 紅圈與黑色矩形相交。想像兩條穿過對角的虛線。如果您知道圓圈所在的兩條線的哪一側,則可以推斷出相撞的邊緣。
首先聲明類範圍內的私有成員
Rectangle CollisionBoxRect;
Rectangle circleRect;
Dictionary<string, Vector2> corners;
在你更新你移動後的圓圈,並設置它的位置和潛在的交叉框的位置,它基本檢查,看是否圓的邊界矩與卷的邊界矩有關。如果是這樣,它會根據碰撞的圓的哪一側以適當的碰撞法線改變球的速度。
if (CollisionBoxRect.Intersects(circleRect))
{
ballVelocity = Vector2.Reflect(ballVelocity, GetCollisionNormal(CollisionBoxRect));
}
以下方法支持獲取正確的一面(實際上是正常的)。其中一些方法可以在初始化階段完成一次,如果它們從不改變(如get corner方法);
private Vector2 GetCollisionNormal(Rectangle boxBeingIntersected)
{
getCorners(boxBeingIntersected);
bool isAboveAC = isOnUpperSideOfLine(corners["bottomRight"], corners["topLeft"], getBallCenter());
bool isAboveDB = isOnUpperSideOfLine(corners["topRight"], corners["bottomLeft"], getBallCenter());
if (isAboveAC)
{
if (isAboveDB)
{
//top edge has intersected
return -Vector2.UnitY;
}
else
{
//right edge intersected
return Vector2.UnitX;
}
}
else
{
if (isAboveDB)
{
//left edge has intersected
return -Vector2.UnitX;
}
else
{
//bottom edge intersected
return Vector2.UnitY;
}
}
}
public bool isOnUpperSideOfLine(Vector2 corner1, Vector2 oppositeCorner, Vector2 ballCenter)
{
return ((oppositeCorner.X - corner1.X) * (ballCenter.Y - corner1.Y) - (oppositeCorner.Y - corner1.Y) * (ballCenter.X - corner1.X)) > 0;
}
private Vector2 getBallCenter()
{
return new Vector2(circleRect.Location.X + circleRect.Width/2, circleRect.Location.Y + circleRect.Height/2);
}
private void getCorners(Rectangle boxToGetFrom)
{
corners.Clear();
Vector2 tl = new Vector2(boxToGetFrom.X, boxToGetFrom.Y);
Vector2 tr = new Vector2(boxToGetFrom.X + boxToGetFrom.Width, boxToGetFrom.Y);
Vector2 br = new Vector2(boxToGetFrom.X + boxToGetFrom.Width, boxToGetFrom.Y + boxToGetFrom.Height);
Vector2 bl = new Vector2(boxToGetFrom.X, boxToGetFrom.Y + boxToGetFrom.Height);
corners.Add("topLeft", tl);
corners.Add("topRight", tr);
corners.Add("bottomRight", br);
corners.Add("bottomLeft", bl);
}
哇,非常感謝您深入響應。對不起,我只是意識到,我收到了這篇文章的回覆... 我會看看這個,並嘗試在我的代碼中實現它,因爲我仍然有相同的概率,但我今天才恢復完成此遊戲......我會讓你知道發生了什麼......謝謝你 – 6a6179