Java-弹起一个抛射球-我怎样才能反转垂直速度



我试图在java中反弹,但我很难弄清楚如何以在球撞击视口时反转球速度的垂直分量。我的主要问题(可能很愚蠢(是我不明白当速度公式将负值平方时,速度分量的方向(在这种情况下为-(对总速度有贡献。谢谢你的帮助。

目前,当投射物击中视口时,我有点重新启动它,但这存在角度错误的问题。

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;
public class Trajectory5 extends JComponent {
private static final long serialVersionUID = 1L;
Timer timer; double x; double y; double vy; double vx;
double t = 0; double a = 70; double v = 40;
double offsetx = 0; double offsety = 400;
double xmult = 0;
public Trajectory5() {
setFocusable(true);
timer = new Timer(1, new TimerCallback()); 
timer.start();}
@Override
public void paintComponent(Graphics g) {
g.fillOval((int) x, (int) y, 10, 10);
}
protected class TimerCallback implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
t += .01;
x = ((int) v*Math.cos(Math.toRadians(a)) * t + offsetx) + -xmult;
y = getHeight() - ((int) v * Math.sin(Math.toRadians(a)) * t-.5 * 9.8 * (Math.pow(t, 2))) - offsety;
vy = v * Math.sin(Math.toRadians(a)) - (t * 9.8);
vx = v * Math.cos(Math.toRadians(a));
System.out.println(vy + " " + vx);
if (y > getHeight()) {
offsetx = x;
offsety = 0;
v = Math.sqrt(Math.pow(vx, 2)+Math.pow(vy, 2));
t = 0;
}
repaint();
}
}
public static void main(String[] args) {
JFrame frame = new JFrame(); frame.setSize(1000, 800);
Trajectory5 canvas = new Trajectory5();
frame.add(canvas); frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

所以这里的问题实际上是一个结构性问题,你让它变得比需要的更复杂。这实际上更像是一个数学问题,而不是编程问题。

你的x和y坐标从某个位置开始,然后你必须根据某个因素进行调整。您将根据a(调整位置。当时的速度,以及c(。基于你使用的单位的任意分数

要完成这些步骤,实际上取决于你在做什么,但为了简单起见,假设你已经完成了vx和vy的计算(你可以自己计算(,你的操作看起来像:

public void a...{
deltaX = vx * getTimeFraction();
deltaY = vy * getTimeFraction();
...
}

deltaXdeltaY是你要移动球的实际距离。所以要移动它,我们必须将它应用于实际的x和y变量。

public void a...{
deltaX = vx * getTimeFraction();
deltaY = vy * getTimeFraction();
x += deltaX;
y += deltaY;
}

这将分别移动x和y、deltaX和deltaY距离。注意,如果deltaX为负,它将向左移动,如果delta Y为负,则它将向下(或向上,取决于您决定为负(

我们几乎完成了,所以在这一点上,我们必须定义getTimeFraction()

public double getTimeFraction(){
return 1 / iterationsPerSecond;
}

iterationsPerSecond将被定义为你每秒想要的小动作量。

这涵盖了所有的移动,但在此之前,您需要定义vx和vy是什么,因此您的最终结果将类似于:

public void a...{
calculateVelocities();
deltaX = vx * getTimeFraction();
deltaY = vy * getTimeFraction();
x += deltaX;
y += deltaY;
}

最新更新