2017-08-16 53 views
1

所以我在android studio中做了一个突破游戏。(Java)在突破游戏中使用矢量碰撞

在制作了一个游戏循环和与桨和砖的基本碰撞后,我注意到我的球已经开始通过我的砖和桨在增加速度后进行剪辑。

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

我读过关于使用矢量数学解决方案。但是对我来说这太过分了,因此我的头也围绕着它。 我指的是这个问题的答案: Refer Here

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

那么我将如何改变这个弄成这个样子: Demo

提前致谢!

回答

0

在每个循环中,您应该记录上一次球的位置。当你发现碰撞时,你应该立即将球移动到前一帧位置,然后处理反弹效果。它不应该两次注册碰撞,这意味着你没有正确处理碰撞。如果你说当你提高速度时,球看起来会通过桨,那么你需要看看你如何解决速度或提高帧率。你的FPS设置了什么?

你还可以看到我的答案herehere

+0

我的FPS设定为60 但我认为解决的办法是,如果我的下一个球的位置拦截任何块或桨看到,如果不将其设置为最接近的墙壁并反转速度。 – MrPako

+0

不正确!如上所述,当您检测到碰撞时,您应该在碰撞发生之前将球的位置设置到先前的位置,然后您可以反转所有不考虑偏转角度的速度。所以你需要存储每个循环的前一帧位置 – Rob85

+0

嗯。但是如果球的位置非常远并且球非常快,那么它可能会错过碰撞。实际上,我终于弄明白了,在我把所有的东西都工作后,我会发布我的答案:D – MrPako