首页 文章

Java Brickbreaker桨式碰撞检测

提问于
浏览
1

我正在尝试制作一个破砖游戏,并且在碰撞检测方面遇到了一些问题 . 如果你曾经玩过破砖机,你就会知道在球拍上,如果球向左移动而你击中顶部的左侧,那么它会继续向右移动 . 虽然,如果你在这种情况下在右侧击中它,那么球会改变方向 . 而且如果你在桨的侧面碰到它,它会在Y轴上反弹 . 由于我不知道如何做桨的顶部,我无法向您展示代码,因为我没有任何:)这是我正在使用的代码:

Rectangle rect1 = new Rectangle((int) paddleDir, 570, imsLoader.getImage("paddle1").getWidth(), imsLoader.getImage("paddle1").getHeight());
Rectangle rect2 = new Rectangle((int) ballX, (int) ballY, imsLoader.getImage("ball").getWidth(), imsLoader.getImage("ball").getHeight());
if (rect1.intersects(rect2))
{
    if (rect1.x == rect2.getMaxX() || rect1.getMaxX() == rect2.x)
    {
        ballVX = -ballVX;
        clipsLoader.play("pattleHit", false);
    }
    else
    {
        ballVY = -ballVY;
        ballY += 0.05;
        clipsLoader.play("pattleHit", false);
    }
}

会发生什么事情是当球被击中时,球正好穿过球拍到达整个地方,当它到达另一端时,要么上升还是下降!

1 回答

  • 1

    你必须让球反弹,对吧?

    我们来看一个例子 . 认为顶部正方形是球(我不能画得那么好) . 当球从左侧碰撞时,它应向右移动,如果它从右侧移动,则向左移动 .

    enter image description here

    你可以通过简单的事情实现这一目标 . 不要改变水平速度,而是改变垂直速度 .

    if (ball.getBounds().intersects(paddle.getBounds()))
    {
        ball.setVy(-ball.getVy());
    }
    

    好吧!

    现在让我们弄清楚如何对砖块进行弹跳效果 .

    enter image description here

    这是一个球击中砖的场景 . 红色区域是交叉点 . 现在仔细注意一下 .

    • 如果交叉点宽度大于交叉点高度,则球会撞到砖的底部或垂直两侧 .

    • 如果交叉点高度大于交叉点宽度,那么它是水平碰撞 .

    所以我们必须先计算交叉矩形 . 用java很容易 .

    Rectangle intersection = ball.getBounds().intersection(brick.getBounds());
    

    现在让我们实现弹跳 .

    if (intersection.width >= intersection.height)
    {
        ball.setVy(-ball.getVy());
    }
    
    if (intersection.height >= intersection.width)
    {
        ball.setVx(-ball.getVx());
    }
    

    就是这样,你应该让它完全正常运作 .

相关问题