(Java)在突破游戏中使用向量碰撞

(Java)在突破游戏中使用向量碰撞,java,android,vector,collision-detection,Java,Android,Vector,Collision Detection,所以我在安卓工作室制作了一个突破游戏 在做了一个游戏循环和与桨和桨的基本碰撞后,我注意到我的球在提高速度后开始穿过我的桨和桨 问题在于它在一帧中碰撞了两次,所以我的基本碰撞对它来说是不够的 我读过关于使用向量数学解决问题的书。但这对我来说太多了,太让我头疼了。 我指的是这个问题的答案: 那么我该如何将其转化为这样的东西: 提前谢谢 在每个环上,你都应该记录下球的先前位置。当您检测到碰撞时,应立即将球移动到前一帧位置,然后处理反弹效果。它不应记录碰撞两次,这意味着您未正确处理碰撞。如果你是说当

所以我在安卓工作室制作了一个突破游戏

在做了一个游戏循环和与桨和桨的基本碰撞后,我注意到我的球在提高速度后开始穿过我的桨和桨

问题在于它在一帧中碰撞了两次,所以我的基本碰撞对它来说是不够的

我读过关于使用向量数学解决问题的书。但这对我来说太多了,太让我头疼了。 我指的是这个问题的答案:

那么我该如何将其转化为这样的东西:


提前谢谢

在每个环上,你都应该记录下球的先前位置。当您检测到碰撞时,应立即将球移动到前一帧位置,然后处理反弹效果。它不应记录碰撞两次,这意味着您未正确处理碰撞。如果你是说当你提高速度时,球似乎要穿过球拍,那么你要么看看你是如何计算速度的,要么提高帧速率。你的FPS设定在什么位置


你还可以看到我的答案,并且在每个环上你都应该记录下之前的球位。当您检测到碰撞时,应立即将球移动到前一帧位置,然后处理反弹效果。它不应记录碰撞两次,这意味着您未正确处理碰撞。如果你是说当你提高速度时,球似乎要穿过球拍,那么你要么看看你是如何计算速度的,要么提高帧速率。你的FPS设定在什么位置


您还可以查看我的答案,并且

我的fps设置为60。但我认为解决办法在于看我的下一个球位是否拦截了任何挡块或挡板,以及它是否将其设置到最近的墙并反转速度。不正确!如上所述,当您检测到碰撞时,您应该将球的位置设置为碰撞发生之前的位置,然后您可以反转速度,尽管这不会考虑偏转角度。因此,您需要存储每个循环的前一帧位置。但是这样的话,如果球的位置很远,而且球很快,那么它可能会错过碰撞。事实上,我终于找到了答案,我会在一切正常后发布我的答案:DMy fps设置为60。但我认为解决办法在于看我的下一个球位是否拦截了任何挡块或挡板,以及它是否将其设置到最近的墙并反转速度。不正确!如上所述,当您检测到碰撞时,您应该将球的位置设置为碰撞发生之前的位置,然后您可以反转速度,尽管这不会考虑偏转角度。因此,您需要存储每个循环的前一帧位置。但是这样的话,如果球的位置很远,而且球很快,那么它可能会错过碰撞。事实上,我终于找到了答案,我会在一切正常后发布我的答案:D
if (RectF.intersects(bricks[i].getRect(), ball.getRect())) {

Brick brick = bricks[i];

if(ball.getRect().centerX()>brick.minX() && ball.getRect().centerX() < brick.maxX()){

    ball.reverseYVelocity();

    if(ball.getRect().top > brick.getRect().centerY()){

        ball.clearObstacleY(brick.getRect().bottom - ball.getRect().height());

    } else {

        ball.clearObstacleY(brick.getRect().top + ball.getRect().height());

    }

} else {

ball.reverseXVelocity();

if(ball.getRect().left > brick.getRect().centerX()){

    ball.clearObstacleX(brick.getRect().right + ball.getRect().width());

} else {

ball.clearObstacleX(brick.getRect().left - ball.getRect().width());

}
}
public void update(long fps, float speed){
    rect.left    = rect.left   + (xVelocity*speed / fps);
    rect.top     = rect.top    + (yVelocity*speed / fps);
    rect.right   = rect.left   + ballWidth;
    rect.bottom  = rect.top    - ballHeight;
}