簡體   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