2

我的对象目前仅使用以下代码以设定的角度直线前进:

    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 _

游戏逻辑:https ://gist.github.com/Fogest/36aba3e1a7fc30984e4e

4

3 回答 3

3

你在这里误用了基本的运动方程。在上面的示例中,您实际上是通过重新添加重力来抵消重力的影响。

通过更新您的速度,已经考虑了重力的全部影响。此外,在增量计算中使用绝对时间是没有意义的,并且 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;
}

随着时间的推移,这将是一个运动的弹丸。如果您有任何问题,请告诉我。

哦,看起来您几乎正确地实现了代码,错误现在出现在您制作 2​​d 点并从您的方法返回的方式上。我不确定您使用的是什么 IDE,但它确实应该给您一个编译错误。

Point2D p = new Point2D.Double(x,y);
return p;

应替换为:

return new Point2d.Double(this.x, this.y)
于 2013-06-10T21:28:34.640 回答
3

在三角法中使用角度之前,您必须将角度从度数转换为弧度。来自Math.sinJavadocs:

参数:

a - 一个角度,以弧度为单位。

乘以Math.PI然后除以 180 以将度数转换为弧度。

于 2013-06-10T21:08:43.520 回答
1

在这些行中,我认为您不小心交换axay

// 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保持不变。

于 2013-06-10T21:13:24.067 回答