这可能是一个非常基本的问题,但我似乎无法找到任何其他文章.
无论如何,我用Java编写了一个小弹跳球程序,试图扩展我的基本技能.该计划只是一个简单的弹跳球,将会下降,并希望有一段时间反弹.原始程序工作正常,但现在我已经尝试将重力添加到程序中.重力实际上可以正常运行一段时间但是一旦弹跳变得非常小,动画在很短的时间内变得不稳定,那么球的位置就会不断减小.我试图找出问题,但我只是看不到它.任何帮助都是最受欢迎的.
public final class Ball extends Rectangle {
float xspeed = 1.0f; float yspeed = 1.0f; float gravity = 0.4f;
public Ball(float x, float y, float width, float height) {
super(x, y, width, height);
}
public void update(){
yspeed += gravity;
move(xspeed, yspeed);
if(getX() < 0){
xspeed = 1;
}
if(getX() + getWidth() > 320){
xspeed = -1;
}
if(getY() < 0){
yspeed = 1;
}
if(getY() + getHeight() > 200 && yspeed > 0){
yspeed *= -0.98f;
}
if(getY() + getHeight() > 200 && yspeed < 0){
yspeed *= 0.98f;
}
}
public void move(float x, float y){
this.setX(getX()+x);
this.setY(getY()+y);
}
}
编辑:谢谢,似乎已经排序了飘忽不定的运动.我仍然在努力想看看当它停止弹跳时我怎么能阻止我的球向下移动.现在它将移动停止弹跳然后继续向下移动通过“地板”.我认为这与我的yspeed = gravity line有关.我只是看不出如何停止运动.
解决方法:
当你这样做
yspeed += gravity;
你假设球有空间移动距离dx = v_i * t 1/2(-g)t ^ 2.当你离地板很近时,这可能不是真的.它会失败,如果:
>你离地板足够近,向下移动
>你离地板非常近,速度很慢(就像球失去了大部分能量一样)
这个错误导致您的模拟停止节约能量,导致您在低振幅下看到的不稳定行为.
您可以通过使用较小的时间步骤来减少问题,如果您进行测试计算以便在您离开房间时注意并为该迭代选择安全时间步骤(即始终使用您的默认值,则可以完全摆脱它)有问题,然后计算最佳时间步骤).
但是,您在此处使用的基本近似值也存在其他问题.查看任何数值分析文本,以获得数值求解微分方程的讨论.
标签:java,graphics,physics
来源: https://codeday.me/bug/20190730/1585130.html