Java Brickbreaker 桨碰撞检测

标签 java collision-detection java-2d

我正在尝试制作一款打砖 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 ,到处游走,当它到达另一端时,要么向上要么向下!

最佳答案

你必须让球弹起来,对吧?

让我们看一个例子。将顶部的正方形视为球(我无法画得那么好)。当球从左侧碰撞时,它应该向右移动,如果是从右侧碰撞,则应向左移动。

enter image description here

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

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

简单吧!

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

enter image description here

这是球撞到砖 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/

相关文章:

Java 2D碰撞响应方法

java - 如何在 java2D 中获取 Font X 偏移宽度?

java - 检查java中零循环线程中的中断

java - 如何在 session 中存储检索对象并在之后访问它?

c++ - opencv - 预测球的碰撞

java - 在图像上附加文本时指定行距

java - 在这种情况下如何避免 instanceof 运算符

java - Java 中的 BigDecimal 行为

c# - 当字典键发生哈希冲突时会发生什么?