物体的弹丸运动 - java

我的对象当前仅使用以下代码以设定角度沿直线移动:

    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

参考方案

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

通过更新速度已经考虑了重力的全部影响。此外,在增量计算中使用绝对时间是没有意义的,并且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 Point并从方法返回的方式。我不确定您使用的是哪个IDE,但它确实应该给您一个编译错误。

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

应替换为:

return new Point2d.Double(this.x, this.y)

用Java构建大批量数据处理工具 - java

Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过editing this post专注于一个问题。 3年前关闭。 Improve this question 我正在尝试使用Java构建ETL工具。 ETL工具用于对大量数据(关系型和其他类型)进行批量读取,…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

来自同步块的Java方法调用 - java

在Java中假设我有一个类似的代码class A { method A(){ synchronized(this) { this.B(); } } method B(){ //do modification stuff here } } 我的问题是,如果一个线程在methodA上工作而另一个在methodB上工作,那么我的同步块如何得到保护? 参考方案 Ja…