我制作了游戏“Breakout”。一个有趣的小项目。
现在,我通常不制作游戏,所以我通常不会考虑碰撞处理。
我有一个桨、一个球和一些砖块。
现在,当发生碰撞时(我在提到的每个对象周围绘制矩形),我只需将球的 Y 值更改为 -Y。
这很好用,除非球从侧面(东或西)击中砖块。副作用并不漂亮,并且破坏了游戏玩法。
我想我可以放心地假设,当这种情况发生时,我需要将 X 值更改为 -X 而不是上述技术。
到目前为止,我有:if (ballRect.IntersectsWith(brickRect))
ballRect
并且brickRect
是围绕每个对象的矩形。
现在,如果我在砖的东部边界、西部边界等周围创建一个矩形会怎样?我猜宽度大约是一个像素。
如果与西部或东部矩形发生碰撞,则球 X 值应为 -X。反之亦然。
但是角落呢?我应该随机选择哪个矩形来控制 x 角吗?
或者我应该在每个角周围做一个矩形?矩形的边长为 1*1。如果有碰撞 => -x AND -y 球的值?
请分享你的想法。
到目前为止的过程如下:
foreach (var brick in Bricks)
{
if (brick.IsAlive)
{
var brickRect = new Rectangle(brick.X, brick.Y, BrickWidth, BrickHeight);
if (ballRect.IntersectsWith(brickRect)) //Ball has hit brick. lets find out which side of the brick
{
var brickRectNorth = new Rectangle(brick.X, brick.Y + BrickHeight, BrickWidth, 1);
var brickRectSouth = new Rectangle(brick.X, brick.Y, BrickWidth, 1);
var brickRectEast = new Rectangle(brick.X, brick.Y, 1, BrickHeight);
var brickRectWest = new Rectangle(brick.X + BrickWidth, brick.Y, 1, BrickHeight);
if (ballRect.IntersectsWith(brickRectNorth) || ballRect.IntersectsWith(brickRectSouth))
{
//STUFF that makes ball.y = -ball.y
}
if (ballRect.IntersectsWith(brickRectWest) || ballRect.IntersectsWith(brickRectEast))
{
//STUFF that makes ball.x = -ball.x
}
}
}
}