【问题标题】:(Java)Using vector collision in a Breakout game(Java)在 Breakout 游戏中使用矢量碰撞
【发布时间】:2017-08-16 10:12:18
【问题描述】:

所以我在 android studio 中制作了一款突破性的游戏。

在进行游戏循环并与球拍和积木发生基本碰撞后,我注意到我的球在提高速度后开始穿过我的积木和球拍。

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

我读过有关使用矢量数学的解决方案。但这对我来说太过分了。 我指的是这个问题的答案: 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

提前致谢!

【问题讨论】:

    标签: java android vector collision-detection


    【解决方案1】:

    在每个循环中,您都应该记录球的先前位置。当您检测到碰撞时,您应该立即将球移动到前一帧位置,然后处理反弹效果。它不应该记录两次碰撞,这意味着您没有正确处理碰撞。如果您说当您增加速度时,球似乎会通过桨,那么您需要查看如何计算速度或增加帧速率。你的 FPS 是多少?

    你也可以看到我的回答herehere

    【讨论】:

    • 我的 fps 设置为 60。但我认为解决方案在于查看我的下一个球位置是否拦截任何块或桨,是否将其设置为最近的墙壁并反转速度。
    • 不正确!如上所述,当您检测到碰撞时,您应该将球的位置设置为碰撞发生之前的先前位置,然后您可以反转速度,尽管这不会考虑偏转角。所以你需要存储每个循环的前一帧位置
    • 嗯。但是那样的话,如果球的位置很远而且球很快,那么它可能会错过碰撞。实际上,我终于想通了,我会在一切正常后发布我的答案:D
    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 2013-02-25
    相关资源
    最近更新 更多