Animation 球与砖碰撞处理

Animation 球与砖碰撞处理,animation,collision-detection,Animation,Collision Detection,我做了一个游戏“突破”。一个有趣的小项目 现在,我通常不做游戏,所以碰撞处理不是我通常考虑的事情 我有一个桨,一个球和一些砖块 现在,当发生碰撞时(我在提到的每个对象周围绘制矩形),我只需将球的Y值更改为-Y 这很好,除非球从侧面(东或西)撞到砖头上。副作用不好看,破坏了游戏性 我想我可以安全地假设,当发生这种情况时,我需要将X值更改为-X,而不是使用上述技术 到目前为止,我有:if(ballcrect.IntersectsWith(brickRect)) ballRect和brickRect是

我做了一个游戏“突破”。一个有趣的小项目

现在,我通常不做游戏,所以碰撞处理不是我通常考虑的事情

我有一个桨,一个球和一些砖块

现在,当发生碰撞时(我在提到的每个对象周围绘制矩形),我只需将球的Y值更改为-Y

这很好,除非球从侧面(东或西)撞到砖头上。副作用不好看,破坏了游戏性

我想我可以安全地假设,当发生这种情况时,我需要将X值更改为-X,而不是使用上述技术

到目前为止,我有:
if(ballcrect.IntersectsWith(brickRect))

ballRect
brickRect
是围绕每个对象的矩形

现在,如果我在砖块的东边界、西边界等周围创建一个矩形,会怎么样?我猜宽度大约是一个像素

如果与西部或东部矩形发生碰撞,则balls X值应为-X。 反之亦然

但是拐角处呢?我是否应该随机选择要控制x角的哪个矩形

或者我应该在每个角落周围画一个矩形?边长为1*1的矩形。 如果发生碰撞=>-x和-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
                }
            }
        }
    }

与其寻找矩形交点,不如与实际边相交。在拐角处,球同时接触两条边,因此其运动矢量应受到这两条边的影响

我会保留单个矩形用于碰撞检测,因为这样可以减少需要在外部循环中测试的矩形数量,但是一旦检测到与砖块的碰撞,就进入内部循环以检测碰撞的边。如果只测试每条边并相应地调整每条边的向量,则角点将免费出现(只要在找到第一条相交边时不中断循环)

编辑:回答您更新的问题:

事实上,我会这样做(考虑到您的代码,这似乎是C#3.0,所以我在下面假设):

foreach(砖中的var砖){
如果(brick.IsAlive){
var brickRect=新矩形(brick.X、brick.Y、BrickWidth、BrickHeight);
if(与(砖块)相交的直线){
//球击中了砖块。现在让我们相应地调整球的矢量
//方便变量。编译器可能会内联。
var brickLeft=brick.X;
var brickRight=brick.X+BrickWidth;
var brickTop=brick.Y;
var brickBottom=brick.Y+BrickHeight;
var ballLeft=ball.X-ball.Radius;
var ballRight=球.X+球.半径;
var ballTop=ball.Y-ball.Radius;
var ballBottom=球.Y+球.半径;
//测试需要翻转的向量

bool flipX=(ballRight>=brickLeft | | | ballLeft=brickBottom | | | | ballboottom |感谢您的反馈。我没有想到这一点。球是一个长方形的(尽管绘制为日食)半径是:int ballRadius=BallSize/2;关于//的东西…我基本上只是做了很多事情,比如给玩家一些分数,杀死砖块等等。最后,它字面上写着:BallDirection=new Point(-BallDirection.X,BallDirection.Y);//x=-x您的代码给了我一些非常奇怪的结果,但我将进一步研究它
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.  Now let's adjust the ball's vector accordingly

            // Convenience variables.  Compiler will probably inline.
            var brickLeft = brick.X;
            var brickRight = brick.X + BrickWidth;
            var brickTop = brick.Y;
            var brickBottom = brick.Y + BrickHeight;

            var ballLeft = ball.X - ball.Radius;
            var ballRight = ball.X + ball.Radius;
            var ballTop = ball.Y - ball.Radius;
            var ballBottom = ball.Y + ball.Radius;

            // Test which vector(s) we need to flip
            bool flipX = (ballRight >= brickLeft || ballLeft <= brickRight);
            bool flipY = (ballTop >= brickBottom || ballBottom <= brickTop);

            // Flip the vectors (there are probably ways to optimize this,
            // too, but without seeing your code I can't tell).
            if(flipY) {
                // Stuff that makes ball.y = -ball.y
            }

            if(flipX) {
                // Stuff that makes ball.x = -ball.x
            }
        }
    }
}