当在Libgdx中创建游戏时,我没有使用物理引擎,因为我在游戏中没有太多的移动部件。因此,为了让对象从屏幕顶部落到底部,我使用了文档所具有的内容,如下所示:
projectile.y -= 200 * Gdx.graphics.getDeltaTime();
这个例子将使所述抛射物以每秒200像素的速度下降(我相信)。我想要做的是在两秒钟之后这样做,射弹将从每秒200负转变为每秒200正。我尝试过使用循环和Thread.sleep,但这只会冻结整个游戏,并且射弹会以另一种方式解冻。有什么想法吗?
答案 0 :(得分:1)
线性插值。
您需要做的就是确定起点:x1 = -200
确定终点:x2 = 200
确定到达终点所需的秒数:tmax = 2.0秒
确定需要添加到原始图像以达到终点的差异:v =(x2-x1)=(200 - ( - 00))= 400
使用线性插值函数:x1 + t * v = x2其中t e [0 ... 1] //must be normalized to 0..1 interval
因此在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;
}
答案 1 :(得分:0)
要改变y的方向,需要x的多项式函数。对于单个方向更改,请使用二项式;尝试像
这样的东西projectile.y = projectile.y
- 200 * Gdx.graphics.getDeltaTime()
+ 20 * Math.pow(Gdx.graphics.getDeltaTime(), 2);
答案 2 :(得分:0)
如果您正在寻找速度的线性插值,只需跟踪时间。
float timeElapsed = 0.0f;
void render() {
timeElapsed += Gdx.graphics.getDeltaTime();
projectile.y -= 200.0f * (1.0f - timeElapsed);
}
确保在timeElapsed达到2秒后停止(如果(timeElapsed< 2.0f),则为#s; s)。时间流逝变量将从0.0f开始并将缓慢增加。直到它达到1.0f,projectile.y将从中减去。但是,一旦经过的时间高于1.0f,projectile.y就会被添加到。