我正在尝试制作一款打砖 block 游戏,但在碰撞检测方面遇到了一些问题。如果您曾经玩过打砖 block 游戏,您就会知道,在桨上,如果球向左移动并且您击中顶部的左侧,那么它会继续向右移动。不过,如果在这种情况下击球在右侧,球就会改变方向。而且,如果你击打桨的侧面,它会在 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);
}
}
发生的情况是,当球从侧面被击中时,它会直接穿过 Racket ,到处游走,当它到达另一端时,要么向上要么向下!
最佳答案
你必须让球弹起来,对吧?
让我们看一个例子。将顶部的正方形视为球(我无法画得那么好)。当球从左侧碰撞时,它应该向右移动,如果是从右侧碰撞,则应向左移动。
您可以通过简单的事情来实现这一点。不要改变水平速度,而是反转垂直速度。
if (ball.getBounds().intersects(paddle.getBounds()))
{
ball.setVy(-ball.getVy());
}
简单吧!
现在让我们弄清楚如何在砖 block 上实现反弹效果。
这是球撞到砖 block 时的场景。红色区域是交叉路口。现在请仔细注意。
如果交叉点宽度大于交叉点高度,则球击中了砖 block 的底部或垂直侧面。
如果交叉点高度大于交叉点宽度,则为水平碰撞。
所以我们首先要计算交集矩形。用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());
}
就是这样,您应该让它功能齐全。
关于Java Brickbreaker 桨碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18418125/