[英]How to get smoother 2d projectile physics
所以我想开始研究一个2D平台游戏,直到明年我才会进入物理学,所以我在一本旧物理书中发现了这个方程式,我必须帮助找到x和y位置以及它们的速度。 问题是,它们似乎加速太快,因为渲染速度太慢。 这不是程序故障,我的错,因为我不知道如何减慢加速度使它看起来更平滑。 这是我正在使用的球类的代码(我知道代码是一个绝对的混乱!我只是在努力使方程式正确...我永远不会写这样的代码,如果我在工作在一个严肃的项目,所以请不要提醒我,它看起来很糟糕)
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JComponent;
public class Ball extends JComponent{
public double xpos;
double oX;
double oY;
double ypos;
double xvel;
double yvel;
long time;
double oxvel;
double oyvel;
long angle = 45;
long startTime = System.currentTimeMillis();
public Ball(int p1, int p2, long t){
xpos = p1;
oxvel = 50;
oX = p1;
ypos = p2;
time = t;
oyvel = -50;
}
public void update(){
xvel = (oxvel*Math.cos(45));
yvel = (oyvel*Math.sin(45)) + (9.8*time);
if(!(xpos + xvel + 10 > getWidth())&&!(xpos + xvel < 0))
xpos +=xvel;
if(!(ypos + yvel + 10 > getHeight())&&!(ypos + yvel <= 0))
ypos+=yvel;
time++;
}
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.RED);
g2d.fillOval((int)xpos, (int)ypos, 15, 15);
}
}
您有硬编码时间,在更新循环中,您只需将加速度乘以预先计算的时间步长(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;
}
在整个循环中,您将测量实际的时间步长并通过它。 您可以使用System.currentTimeMillis();
测量System.currentTimeMillis();
long previousStep=System.currentTimeMillis();
public void gameLoop(){
long newStep=System.currentTimeMillis();
double frameTime=(newStep-previousStep)/1000.0;
ball.update(frameTime);
previousStep= newStep;
}
time
应该很可能不会很long
但应该是一个double
,以整数增量测量的实时很难得到正确的。
Euler方法对于忠实的物理模拟来说是相当糟糕的,特别是如果你采用与两帧之间的时间一样大的时间步长。 每帧执行多个10-20模拟步骤或使用更高阶的积分方法。
即使使用欧拉方法,您也需要在差分系统的所有部分应用时间步长。 就是这样
velocity += acceleration*timestep
position += velocity*timestep
如果你打算将它作为某种辛积分器,假设加速度是由梯度力场产生的,而且只取决于位置,交换零件,首先更新位置,
position += velocity*timestep
velocity += acceleration*timestep
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.