-1

我正在尝试用java制作一个突破性的游戏。球击中石头和球棒时会反弹,但击中墙壁后不会反弹。请参阅此粘贴了解我使用的内容。

http://pastebin.com/pkGsCBMa

任何人都可以发现代码中的错误...

谢谢

编辑:打印速度时,我得到这个输出。

vx 0.0     vy  0.0
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.0     vy  0.0
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02
vx 0.02    vy -0.02

编辑

这就是解决方案。我已将bounce() 方法更改为此。

/**
 * This object bounces back from the other object in a natural way. Please
 * realize that the bounce is not completely accurate because this depends
 * on many properties. But in many situations the effect is good enough. Had
 * some bugs in pixel perfect detection mode if the image has a larger area
 * of complete alpha. If using PPCD, make the object fit the image size by
 * removing the alpha and resizing the image.
 */
public void bounce(GObject other){
    int xd = (int) ((other.x + other.getWidth() / 2) - (x + getWidth() / 2));
    int yd = (int) ((other.y + other.getHeight() / 2) - (y + getHeight() / 2));
    if (xd < 0) {
        xd = -xd;
    }
    if (yd < 0) {
        yd = -yd;
    }
    if (xd > yd) {
        dx = -dx;
    } else {
        dy = -dy;
    }
}
4

2 回答 2

4

此问题的一个常见原因是碰撞对象重叠并陷入连续碰撞状态。

所以球移动得相对较快,并与一个块相撞。然而,由于模拟是离散的,所以球实际上会稍微进入块中。然后,您可以正确检测到碰撞并反转速度。然而,在下一个更新周期,无论出于何种原因,球可能仍然在块内。因此,程序检测到另一个“碰撞”并再次反转速度。

结果是你的球在街区边缘抖动,不断反转速度。

于 2012-06-28T01:44:40.647 回答
3

bounce函数中,ifandelse if并没有涵盖每个值。我建议你>>=<替换<=

于 2012-06-28T01:54:20.020 回答