Java 物体不会跟随抛射体的运动路径

Java 物体不会跟随抛射体的运动路径,java,game-physics,projectile,Java,Game Physics,Projectile,嗨,我正试图想出一种方法,利用抛射运动使物体移动。由于某种原因,当我自己动手做的时候,我得到的是指数运动,而不是弹射。我看过其他的例子,但它们有点不同,因为我有它应该降落的坐标,需要找到它必须射击物体的速度和角度 我的代码: public void updateDir(){ distY = (int)( projectedY - y); distX = (int)(projectedX - x); spdY = (double)(2*distY)/(time*time)

嗨,我正试图想出一种方法,利用抛射运动使物体移动。由于某种原因,当我自己动手做的时候,我得到的是指数运动,而不是弹射。我看过其他的例子,但它们有点不同,因为我有它应该降落的坐标,需要找到它必须射击物体的速度和角度

我的代码:

public void updateDir(){

    distY = (int)( projectedY - y);
    distX = (int)(projectedX - x);
    spdY = (double)(2*distY)/(time*time);
    spdX =  (double)(distX)/time;
    dir = Math.atan(spdY/spdX);


    System.out.println("spdY: " + spdY);
    System.out.println("spdX: " + spdX);
    System.out.println("dir: " + Math.toDegrees(dir));
}


public void move() {
    x +=   (spd*Math.cos(dir));
    y -=  (spd * Math.sin(dir));
}
projectedY和projectedX是它应该降落的坐标

那么,为什么它不是沿着抛射体的运动路径移动,而是沿着指数路径移动呢?

这些是(牛顿)方程,用于计算物体的坐标,从速度v0开始,角度θ,在时间t后受重力g的影响:

x=v0*t*cos(θ)

y=v0*t*sin(θ)-(gt^2)/2

这些公式可以扩展为包括x0和y0,这将是起始位置,也可以将t更改为包括非0的起始时间,这样您可以在路径中找到从1秒到1.5秒的相对差异。这些都被省略了

每次需要绘制对象时,可以使用这些公式计算位置,因为有人(一段代码)跟踪时间(在游戏中非常重要)

代码示例(不完整,也是伪代码):

从上面你应该注意的最重要的一点是,你不需要直接计算x和y的速度,当然,除非你在其他方面需要它们。您可以根据世界的常数和时间,直接计算x和y位置,然后简单地在那里绘制


你也需要解释碰撞的原因,但我想你稍后会谈到这个问题

move()方法中的spd是什么?你在哪里根据重力和时间改变y速度?move()中的spd基本上是运动的spd,它不会改变。y速度是spdY,因此它会根据距离进行更改。问题是,我真的不确定要为重力放什么,因为没有重力。我猜spdY是在计算重力速度,所以我会用两个最上面的方程来计算物体的运动方向(move()中的方程)?我怎样才能找到角度呢?我找x,y层的原因。就是找到到达点所需的角度,你可以分别用y-vel和x-vel替换v0*sin(θ)和v0*cos(θ)。在您的“move()”方法中,您正在向最后一个已知位置添加一点位移,以获得新的位置。直觉上这是一个不错的方法。我想表达的是你不必这么做。每次都可以从头开始计算绝对位置,计算过程中没有任何开销。好的,我将尝试在中实现它,看看会发生什么。非常感谢。
class GUI {
    startProjectile() {
        model.startProjectile();
    }    

    paint() {
        Location l = model.getLocationOfProjectile();
        graphics.draw(projectile, l);
    }
}

class Model {
    startProjectile() {
        long projectileStartTime = System.currenttimemillis();
    }

    Location getLocationOfProjectile() {
        long timeInAir = System.currentTimemillis() - projectileStartTime;
        // Insert formulas for calculating the x and y coordinates based on the time, initial velocity and gravity
    }
}