1

所以我想开始做一个 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);
    }
}
4

2 回答 2

2

您有硬编码时间,在更新循环中,您只需将加速度乘以预先计算的时间步长(1 个任意单位,使用秒单位会更好),您假设每次都是相同的,这总是导致跳跃的动作。您应该改为将变量timestep 传递给方法并使用它。这意味着无论渲染的速度有多快,您都会获得平滑的运动。请记住,您可能会要求 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();

long previousStep=System.currentTimeMillis();
public void gameLoop(){
    long newStep=System.currentTimeMillis();
    double frameTime=(newStep-previousStep)/1000.0;

    ball.update(frameTime);
    previousStep= newStep;
}

time应该很可能不是 along而是应该是 a double,以整数增量实时测量很难正确。

于 2014-05-25T19:23:18.523 回答
1

Euler 方法对于忠实的物理模拟非常不利,尤其是当您采用与两帧之间的时间一样大的时间步长时。每帧执行 10-20 个模拟步骤或使用更高阶的集成方法。

即使使用欧拉方法,您也需要在微分系统的所有部分应用时间步长。所以它是

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

如果你打算让它成为某种辛积分器,假设加速度是由梯度力场产生的,并且只取决于位置,交换零件,先更新位置,

position += velocity*timestep
velocity += acceleration*timestep
于 2014-06-05T17:36:09.360 回答