Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java碎砖机桨叶碰撞检测_Java_Collision Detection_Java 2d - Fatal编程技术网

Java碎砖机桨叶碰撞检测

Java碎砖机桨叶碰撞检测,java,collision-detection,java-2d,Java,Collision Detection,Java 2d,我正在尝试制作一个砖块破解游戏,在碰撞检测方面遇到了一些问题。如果你曾经玩过破砖游戏,你知道在划桨时,如果球向左移动,你击中顶部的左侧,那么它会继续向右移动。不过,如果你在这种情况下从右侧击球,那么球的方向会改变。而且,如果你在桨的侧面击打它,它会在Y轴上反弹。由于我不知道如何制作桨叶的顶部,我无法向您显示代码,因为我没有:)这是我用于侧面的代码: Rectangle rect1 = new Rectangle((int) paddleDir, 570, imsLoader.getImage("

我正在尝试制作一个砖块破解游戏,在碰撞检测方面遇到了一些问题。如果你曾经玩过破砖游戏,你知道在划桨时,如果球向左移动,你击中顶部的左侧,那么它会继续向右移动。不过,如果你在这种情况下从右侧击球,那么球的方向会改变。而且,如果你在桨的侧面击打它,它会在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);
    }
}

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

你必须让球反弹,对吗

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

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

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

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

这是一个令人惊讶的答案!非常感谢你!我在程序上试过了,效果非常好。我唯一改变的是,我也在划桨上增加了侧面弹跳。当我发布程序时,请检查我的网站!这是一个很好的解决方案,但是当球击中边缘时,它可能会出错。你有办法解决这个问题吗?