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);
    }
}

发生的情况是,当球在侧面被击中时,它正好穿过整个地方的桨,当它到达另一端时,要么上升要么下降!

4

1 回答 1

2

你必须让球反弹,对吧?

让我们看一个例子。把上面的正方形想象成球(我画得不好)。当球从左侧碰撞时,它应该向右移动,如果是从右侧,则向左移动。

在此处输入图像描述

你可以通过一个简单的事情来实现这一点。不要改变水平速度,而是反转垂直速度。

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

容易对!

现在让我们弄清楚如何在砖块上做反弹效果。

在此处输入图像描述

这是球击中砖块的场景。红色区域是路口。现在仔细注意。

  • 如果交叉点宽度大于交叉点高度,则球击中了砖的底部或垂直边。

  • 如果交叉点高度大于交叉点宽度,则为水平碰撞。

所以我们必须首先计算相交矩形。用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());
}

就是这样,你应该让它功能齐全。

于 2013-08-24T11:52:29.883 回答