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