我正在尝试以初始水平速度模拟坠落的物体。我知道如何让它水平移动(没有加速度),但由于方程y = gt ^ 2/2 + vt + y0,我在垂直移动时遇到一些麻烦。由于二次方程,我遇到了问题。
我尝试做的是创建一个时间变量,每次SwingTimer执行操作时,该变量将增加1。所以我实际上有一个时间变量。但我不认为这是最好的方法吗?
有人能把我推向正确的方向吗?
您可以在下面找到我已编写的代码:
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();
}
}
提前谢谢!
答案 0 :(得分:0)
重力可以通过简单地从每帧中的Y速度减去(假设正Y方向上升)一个常数(由重力引起的加速度)来实现。
公式y = gt^2/2 + vt + y0
用于计算指定时间后的位置,但您要为每个帧模拟它,因此您需要一个增量方法:
velY = velY - gravity;
这产生了y = gt^2/2 + vt + y0
的近似值。它的差异取决于时间步长。造成这种差异的原因是,这并不能模拟步骤之间的连续加速。 (理论上,如果时间步长无限小,结果将是相同的。)
使其更准确(至少在一些物理引擎中使用)的一种方法是计算每帧的多个步骤(即在更新显示之前进行物理的几次迭代)。
对于科学上准确的模拟,如果没有其他力作用于身体,您在帖子中建议的方法是最准确的。
在actionPerformed
方法中,您可能应该在更新位置之前检查操作是否为计时器事件(以便在发生其他事件时移动速度不快)。