Java Libgdx-减速射弹停止,然后将其反转

Java Libgdx-减速射弹停止,然后将其反转,java,android,libgdx,reverse,Java,Android,Libgdx,Reverse,在Libgdx中创建游戏时,我没有使用物理引擎,因为游戏中没有太多运动部件。因此,为了让对象从屏幕的顶部下降到底部,我使用了文档中的内容,如下所示: projectile.y -= 200 * Gdx.graphics.getDeltaTime(); 这个例子将使所说的投射物以每秒200像素的速度下降(我相信)。我想做的是,在两秒钟后,抛射体将从每秒负200转为每秒正200。我尝试过使用循环和Thread.sleep,但这只会冻结整个游戏,并用相反方向的投射物解冻。有什么想法吗?要得到y方向的

在Libgdx中创建游戏时,我没有使用物理引擎,因为游戏中没有太多运动部件。因此,为了让对象从屏幕的顶部下降到底部,我使用了文档中的内容,如下所示:

projectile.y -= 200 * Gdx.graphics.getDeltaTime();

这个例子将使所说的投射物以每秒200像素的速度下降(我相信)。我想做的是,在两秒钟后,抛射体将从每秒负200转为每秒正200。我尝试过使用循环和Thread.sleep,但这只会冻结整个游戏,并用相反方向的投射物解冻。有什么想法吗?

要得到y方向的变化,需要一个x的多项式函数。对于单方向变化,使用二项式;试试像这样的东西

projectile.y = projectile.y 
    - 200 * Gdx.graphics.getDeltaTime() 
    + 20 * Math.pow(Gdx.graphics.getDeltaTime(), 2);

如果你在寻找速度的线性插值,只需跟踪时间

float timeElapsed = 0.0f;

void render() {
    timeElapsed += Gdx.graphics.getDeltaTime();

    projectile.y -= 200.0f * (1.0f - timeElapsed);
}
确保在时间流逝达到2秒后停止(如果时间流逝<2.0f))。时间流逝变量将从0.0f开始,并缓慢递增。直到它达到1.0f,投射物.y将从中减去。但是,一旦经过的时间高于1.0f,Sproject.y将被添加到。

线性插值

您需要做的就是确定起点:x1=-200

确定终点:x2=200

确定到达终点所需的秒数:tmax=2.0秒

确定需要添加到原始值以达到终点的差值:v=(x2-x1)=(200-(-200))=400

使用线性插值函数:x1+t*v=x2,其中te[0…1]
//必须标准化为0…1间隔

因此,在t=0时,该值为x1+0=x1;当t=(tn/tmax)[即1]时,该值为x1+v=x2

所以你只需要一个从0到2的计时器和下面的等式:

float interpolationTimer = 0.0f;
final float interpolationTimerMax = 2.0f;

public void render()
{
    float delta = Gdx.graphics.getDeltaTime();
    interpolationTimer += delta;
    if(interpolationTimer > interpolationTimerMax )
    {
        interpolationTimer = interpolationTimerMax ;
    }
    velocity.y = -200 + (interpolationTimer/interpolationTimerMax) * (400); //x1 + t*v = x2
    projectile.y -= velocity.y * delta;
}

请注意:我相信
^
是Java中的XOR运算符。也许你想要的是
Math.pow()
方法?这确实会减慢投射物的速度,但是我们能使它在大约一秒钟内从-200变为正200吗?那么,在0.5秒时,它会停下来,在整整1秒的时间里,它会朝相反的方向运动?我已经有了一个工作计时器类,如果还需要的话。@MikeM:谢谢,你说得对&我的java非常生疏对于这个答案的完整性,我要提到的是,这只是可以用来插值的许多可能的
缓解函数之一,这里有更多信息。插值也被称为
tweening
,例如,有用于插值的库。