2013-04-21 26 views
0

我試圖模擬一個初始水平速度下降的對象。我知道如何使它水平移動(無加速度),但由於方程式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(); 
    } 
} 

預先感謝您!

+1

爲了更好地幫助越早,張貼[SSCCE(http://sscce.org/)。 – 2013-04-21 13:29:40

+1

檢查相關模擬[here](http://stackoverflow.com/q/11228554/230513)。 – trashgod 2013-04-21 13:38:51

回答

0

重力可以通過簡單地從每一幀中在Y速度減去(假設正Y方向是向上)一常數(重力加速度)來實現。

公式y = gt^2/2 + vt + y0是用於計算在指定的時間後的位置,但你模擬它對於每幀,所以需要一個增量方法:

velY = velY - gravity; 

這產生y = gt^2/2 + vt + y0近似值。它有多大的分歧取決於時間步驟。不同之處在於,這不能模擬步驟之間的連續加速。 (理論上,如果時間步長無限小,結果將是相同的)。

的一種方法,使其更準確(由至少一些物理引擎使用)是計算的這個每幀的多個步驟(即更新顯示之前執行物理的幾次迭代)。

對於一個科學準確的模擬,如果沒有其他的力作用在身體上,你在後建議的方法是最準確的。


在你actionPerformed方法,你可能應該檢查該操作是計時器事件,更新的位置(因此,如果另一個事件發生時它不會移動更快)前。

+0

我還需要能夠繪製掉落物體的圖形。我認爲velY = velY - 對於圖形來說引力太簡單了?或者還有一種方法可以從中得到圖表嗎?謝謝 – khaled 2013-04-21 15:18:16

+0

「圖表」是什麼意思? (我已經更新了答案,但它可能仍然不是你想要的)。對_velocity_進行簡單的線性調整確實會使位置發生指數變化。 – 2013-04-21 16:22:18