所以我一直在尝试编写物理模拟代码。我通过模拟自由落体来开始小规模。我使用Java Jframe和java中的awt库中的一些方法。但是,我遇到的问题是调整参数以使我的模拟更像生活。我的游戏while循环以恒定的60 FPS运行,这意味着每个循环花费16 ms。每次我更新,我都会执行这些法律:
this.velX = this.velX + (accX)*delta;
this.velY = this.velY + (accY) * delta ;
this.velY = this.velY * 0.9;
this.x = this.x + (int) ((this.velX) * delta);
this.y = this.y + (int) ((this.velY)* delta);
但是,由于我转换为int,因为它们非常小,所以值总是回到0。并且形状的绘制方法只接受int(我认为这是可以理解的,对吧?)我想知道是否会有解决方案?球将被卡住并且其移动不会明显(如果它移动的话)。
我尝试将delta传递为1,并且效果很好,但它过快但我认为它不太现实。因此,如果有人可以给我一些关于这个问题的一般想法,那将是非常有帮助的。
答案 0 :(得分:1)
问题在于以下几行
this.x = this.x + (int) ((this.velX) * delta);
this.y = this.y + (int) ((this.velY)* delta);
将等式[{1}}的后半部分称为((this.velX) * delta) and ((this.velY) * delta)
所以方程应该变成
deltaX and deltaY
现在,问题在于您将this.x = this.x + (int) deltaX;
this.y = this.y + (int) deltaY;
转换为整数,从而将对deltaX and deltaY
位置的贡献降低为零。
即使长时间(超过多个帧)的变化很小,贡献也会变得很大。
假设更改x and y
为deltaX
,它应该能够在.1
帧中添加1
像素转换。
如果你的10
函数只采用整数,那么你应该在那之前转换该行的位置值,它们应该是draw
用于所有其他目的。
所以方程应该是
float or double
现在应该可以了。
注意:我也不知道你是如何维持恒定帧速率的,因为Java无法做到这一点。您必须考虑可变帧速率。您已使用this.x = this.x + this.velX * delta; //this.x is float
this.y = this.y + this.velY* delta; //this.x is float
draw( (int)x, (int)y )
完成了该操作。 Delta值不应该是常数,应该在每帧结束时计算。