我的对象目前只使用以下代码以设定角度直线:
this.time = this.time + deltaTime;
// Vertical : Speed * Sine * Angle
double vy = (this.speed * Math.sin(this.angle)) + this.ax*this.time ;
// Horizontal : Speed * Cosine * Angle
double vx = (this.speed * Math.cos(this.angle)) + this.ay*this.time;
this.x = this.x + vx*this.time;
this.y = this.y + vy*this.time + this.ay*(this.time*this.time);
vx += this.ax * this.time;
vy += this.ay * this.time;
我假设我在计算方面犯了一些数学错误,因为看起来x值是正确的,尽管y值没有回落。
以下是我的初始值,以防您想知道:
this.time = 0.0;
this.deltaTime = .0001;
this.x = 1.0;
this.y = 10;
this.speed = 60.0;
this.ay = -9.8;
this.angle = 45;
this.ax = 0.0;
这是我犯这个愚蠢的错误,还是我错过了一些关键概念?
GamePanel.java:https://gist.github.com/Fogest/7080df577d07bfe895b6
GameLogic:https://gist.github.com/Fogest/36aba3e1a7fc30984e4e
答案 0 :(得分:3)
答案 1 :(得分:2)
你在这里误用了基本的运动方程。在上面的示例中,您可以通过将其重新添加来抵消重力的影响。
通过更新速度已经考虑了整个重力效应。另外,在增量计算中使用绝对时间是没有意义的,并且几乎每个this.time实例都应该被deltaTime替换。
同样在概念层面上,您正在评估微分方程,因此这应该都在循环中。此外,你的方式过于复杂。 修复示例:
this.speed = 60.0;
this.deltaTime = 0.0001;
this.endTime = 10.0;
this.x = 1.0;
this.y = 10;
this.ay = -9.8;
this.ax = 0;
this.angle = 45;
this.vx = this.speed*Math.cos(this.angle*(Math.PI/180.0))
this.vy = this.speed*Math.sin(this.angle*(Math.PI/180.0))
double time = 0.0;
while (time < this.endTime){
time += this.deltaTime;
this.x += this.vx*this.deltaTime;
this.y += this.vy*this.deltaTime;
this.vx += this.ax*this.deltaTime;
this.vy += this.ay*this.deltaTime;
}
随着时间的推移,这将是一个运动中的抛射物。如果您有任何问题,请告诉我。
哦,看起来你大部分都是正确实现了代码,现在错误就是你正在制作你的2D点并从你的方法返回。我不确定你正在使用什么IDE,但它确实会给你一个编译错误。
Point2D p = new Point2D.Double(x,y);
return p;
应替换为:
return new Point2d.Double(this.x, this.y)
答案 2 :(得分:1)
在这些内容中,我认为您不小心交换了ax
和ay
// Vertical : Speed * Sine * Angle
double vy = (this.speed * Math.sin(this.angle)) + this.ax*this.time ;
// Horizontal : Speed * Cosine * Angle
double vx = (this.speed * Math.cos(this.angle)) + this.ay*this.time;
由于ax
为零(由于物体在射弹运动中未获得水平速度),因此输入错误使vy
保持不变。