Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获得更平滑的2d射弹物理_Java_Physics_Projectile - Fatal编程技术网

Java 如何获得更平滑的2d射弹物理

Java 如何获得更平滑的2d射弹物理,java,physics,projectile,Java,Physics,Projectile,所以我想开始做一个2D平台游戏,我要到明年才学物理,所以我在一本旧的物理书中找到了方程,我必须帮助找到x和y的位置以及它们的速度。问题是,它们似乎加速太快,因为渲染太慢。这不是程序的错,是我的错,因为我不知道如何降低加速度,使它看起来更平滑。这是我正在使用的ball类的代码(我知道代码是一团乱麻!我只是在胡闹,试图得到正确的方程…如果我在一个严肃的项目上工作,我永远不会这样写代码,所以请不要提醒我它看起来很糟糕) 导入java.awt.Color; 导入java.awt.Graphics; 导入

所以我想开始做一个2D平台游戏,我要到明年才学物理,所以我在一本旧的物理书中找到了方程,我必须帮助找到x和y的位置以及它们的速度。问题是,它们似乎加速太快,因为渲染太慢。这不是程序的错,是我的错,因为我不知道如何降低加速度,使它看起来更平滑。这是我正在使用的ball类的代码(我知道代码是一团乱麻!我只是在胡闹,试图得到正确的方程…如果我在一个严肃的项目上工作,我永远不会这样写代码,所以请不要提醒我它看起来很糟糕)

导入java.awt.Color;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入javax.swing.JComponent;
公共类球扩展JC组件{
公共双XPO;
双牛;
双oY;
双YPO;
双xvel;
双yvel;
长时间;
双oxvel;
双水平;
长角度=45;
long startTime=System.currentTimeMillis();
公共球(点p1,点p2,长t){
xpos=p1;
oxvel=50;
oX=p1;
ypos=p2;
时间=t;
oyvel=-50;
}
公共无效更新(){
xvel=(oxvel*Math.cos(45));
yvel=(oyvel*数学sin(45))+(9.8*时间);
如果(!(xpos+xvel+10>getWidth())和(!(xpos+xvel<0))
xpos+=xvel;

如果(!(ypos+yvel+10>getHeight())&&!(ypos+yvel您有硬编码的时间,那么在更新循环中,您只需将加速度乘以预先计算的时间步长(1个任意单位,最好使用秒的单位),您假设每次都是相同的,这总是会导致跳跃运动。您应该将可变时间步长传递给该方法并使用该方法。这意味着无论渲染速度有多快,您都会获得平滑运动。请记住,您可能会要求1/60秒的帧,但您不会始终获得准确的运动

public void update(double time){
    xvel = (oxvel*Math.cos(45));
    yvel = (oyvel*Math.sin(45)) + (9.8*time);
    if(!(xpos + xvel + 10 > getWidth())&&!(xpos + xvel < 0))
        xpos +=xvel*time;
    if(!(ypos + yvel + 10 > getHeight())&&!(ypos + yvel <= 0))
        ypos+=yvel*time;
}

时间
很可能不是一个
长的
,但应该是一个
,以整数增量进行实时测量是非常困难的。

Euler方法对于可靠的物理模拟来说是相当糟糕的,特别是如果你采用的时间步长与两帧之间的时间一样大。或者执行一个数字每帧10-20个模拟步骤,或使用高阶积分方法

即使使用Euler方法,也需要在微分系统的所有部分应用时间步长

velocity += acceleration*timestep
position += velocity*timestep
如果你想让它成为某种辛积分器,假设加速度来自于梯度力场,只取决于位置,交换零件,首先更新位置

position += velocity*timestep
velocity += acceleration*timestep

你的物理性能似乎与渲染速率密切相关。这可能是你的问题。另外,为什么时间是整数(或长)非双重相关1-确保您在某个时候调用
repait
,以便重新绘制组件;2-使用
paintComponent
paintComponent
,因为您正在破坏绘制链,这可能会导致一些奇怪;3-在向上执行任何自定义绘制之前调用
super.paintComponent
日期,那么它也应该是
xpos+=xvel*time
ypos+=yvel*time
,这可能是模拟加速的初始问题。
velocity += acceleration*timestep
position += velocity*timestep
position += velocity*timestep
velocity += acceleration*timestep