我使用LWJGL在Java中编写2D Ball-SideScroller。
我目前的问题是,我有某种非确定性行为。如果我在我的应用程序中按下' -Button - 主要类的构造函数(" World")被调用,但球的位置几乎每次都在变化。
这里有一个ScreenShot将解释情况:
http://img5.picload.org/image/lcopowc/landingpoint_0.png
左上角:这是球击中地面的地方 - 当然它应该向下滚动
右上角:那就是这里发生的事情 - 相当不错,尽管球和地之间有2或3个像素
左下:第三个更糟糕 - 80%的球在地上
右下:最后但并非最不重要 - 最糟糕的......这里的球只是忽略了它落在的斜坡上
我尝试了以下方法来解决这个问题:
将渲染从立即更改为VBO
添加了一个一直更新坐标的线程(每隔ms)
检查了FPS-Rate,其恒定为60
这里有一些来自方法的代码" ballReachedGround"虽然我不确定问题是否确实存在于该方法中
private boolean ballReachedGround(double slope) {
if (velocityX > 0) {
return checkFallRight(slope);
} else if (velocityX < 0) {
return checkFallLeft(slope);
}
return false;
}
private boolean checkFallRight(double slope) {
if (ball.getY() + ball.getTransy() + ball.getRadius() >= realY2) {
double xdiff = (ball.getX() + ball.getTransx() + ball.getRadius()) % 50;
double actualHeight = realY1 + (xdiff / 50) * (realY2 - realY1);
if (slope < Math.tan(Math.toRadians(-45))) {
if (ball.getY() + ball.getTransy() + ball.getRadius() >= actualHeight) {
if (ball.getY() + ball.getTransy() >= actualHeight) {
velocityX = 0;
return true;
}
}
System.out.println(slope);
} else {
double angle = Math.toDegrees((Math.atan(slope)));
double anglediff = ball.getRotate() - angle;
ball.setTransy(ball.getTransy() - velocityX * timediff
* Math.tan(Math.toRadians(anglediff)));
if (ball.getY() + ball.getTransy() + 40 >= actualHeight) {
return true;
}
System.out.println(slope);
}
}
return false;
}
答案 0 :(得分:0)
视频很清楚。所以你的物理错了。一旦发现碰撞,您应该尽可能以最短的方式将身体移出静止场景(=地面)。这就是物理引擎的工作原理。因此,换句话说,你的抛物线轨迹似乎很好,但由于这是一个模拟,它会产生步骤,所以它不是一条连续的路径。它将在地面上方的一个框架,而在下一个框架中,它将在地面上。一旦你发现了这一点,将球移回最近的方向。在边缘,如果你在墙壁上反弹,这可能会向左或向右移动。