繁体   English   中英

如何获得更平滑的2d弹丸物理学

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM