繁体   English   中英

掉落的物体,使用计时器卡住

[英]Falling object, stuck on using Timer

我正在尝试以初始水平速度模拟掉落的物体。 我了解如何使其水平移动(无加速度),但是由于方程y = gt ^ 2/2 + vt + y0,在使其垂直移动时遇到了一些麻烦。 由于二次方程式,我遇到了问题。

我试图做的是做一个时间变量,该变量每次由SwingTimer执行操作时都会增加一个。 这样我实际上会有一个时间变量。 但是我不认为这是最好的方法吗?

有人可以将我推向正确的方向吗?

在下面,您可以找到我已经编写的代码:

    public class Simulation extends JPanel implements ActionListener
    {
    Timer timer = new Timer(5,this);;
    private int Xpos=0, Ypos=0, velX, velY;
    private int Px,Py;

    JButton dropknop;
    private boolean drop = false;

    public Simulation()
    {
        this.setBackground(Color.white);
        velX = 2;
        velY = 2;

        dropknop = new JButton("DROP");
        dropknop.addActionListener(this);
        this.add(dropknop);
    }
    public int getXpos() {
        return Xpos;
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawRect(Xpos, 0, 20, 20);

        if(drop)
        {
            g.fillRect(Px, Py, 5, 5);
        }
    }

    public void actionPerformed(ActionEvent ae) 
    {
        if(ae.getSource() == dropknop)
        {
            Px = getXpos();
            this.drop = true;
        }
        if(Xpos<0 || Xpos>986)
        {
            velX = -velX;
        }
        if(Ypos<0 || Ypos>708)
        {
            velY = - velY;
        }

        if(drop)
        {
            Px += velY;
            Py += velX;
        }

        Ypos += velY;
        Xpos += velX;
        repaint();
    }
}

先感谢您!

可以通过简单地从每帧的Y速度中减去(假定正Y方向向上)常数(由于重力引起的加速度)来实现重力。

公式y = gt^2/2 + vt + y0用于在指定时间后计算位置,但是您要针对每一帧进行模拟,因此需要一种增量方法:

velY = velY - gravity;

得出y = gt^2/2 + vt + y0的近似值。 它的差异取决于时间步长。 产生差异的原因是,这不会模拟步骤之间的连续加速度。 (理论上,如果时间步长无限小,结果将是相同的)。

一种提高精度的方法(至少由一些物理引擎使用)是每帧计算此步骤的多个步骤(即在更新显示之前进行物理的几次迭代)。

对于科学上准确的模拟,如果没有其他力作用于身体,则您在帖子中建议的方法是最准确的。


actionPerformed方法中,您可能应该在更新位置之前检查该操作是否为计时器事件(这样,如果发生另一个事件,它就不会更快地移动)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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