2012-11-05 33 views
19

我在用LibGDX(Java)制作游戏。如何制作平滑的相机跟随算法?

我需要相机跟随快速移动的角色。最简单的方法是写这个:

this.getCamera().position.set(obj.x, obj.y, 0); 

但是,有没有任何算法可以使这更加平滑?就像相机不是那么严格一样,并且总是有点晚:角色走得很快,相机跟随着轻微的延迟,或者如果你突然出现在远处的某个地方,相机不会立即传送,而是以最快的速度向你传送越接近它越慢,并再次找到你。

有没有libgdx libs可以做到这一点,或任何人有这种经验?

+0

* *但是,有没有什么算法可以使这个更加流畅?*“你是否尝试过使用任何算法,或者做过任何Google搜索以获得平滑的相机内插? –

+1

我自己试了一下,有几个工作的例子,但我不太喜欢结果,我很好奇,如果有什么东西已经算出来了,因为它听起来像任何游戏开发者都需要的东西,关于谷歌搜索,我不确定搜索什么,它带来了很多其他的东西。 –

回答

6

看看Aurelion Ribon的Java Universal Tween Engine。这将执行插值,并且有几个缓动方程,我认为它们可以帮助您找到所需的内容。它还具有其他高级功能,例如将某些操作定向和链接到其他有趣效果。

你的游戏逻辑可以检查角色是否快速移动或者在位置方面有一个阶跃变化。为此,请将您当前的摄像头位置转换到补间引擎并让它接管 - 顺畅地缩放到角色的当前位置。

+0

只是为了记录(我意识到这是前一阵子)不,你不会想要使用补间引擎,因为游戏角色总是在移动,并且倾向于用户控制的方向变化。启动和杀死补间的开销毫无意义。只需在upd(delta)调用中使用上面的lerp算法即可。这表示UTE uis非常适合其他此类转换,或者甚至可以将摄像头移动到主游戏角色以外的地方。 – RichieHH

+0

我不同意。虽然我没有进行时间分析,但补间的数据是集中在一起的,所以开始和结束的影响应该是最小的。指定一个新的补间只是一组赋值,而杀死一个补间同样只是将对象返回到池中。我在游戏中使用了这种方法来帮助消除相机运动,而不是直接锁定角色而不会影响性能。照相机懒洋洋地跟着看起来好得多的玩家,而不是震动。 – MutantXenu

40

尝试一些简单的方法,如提供距离的十分之一。它工作得非常好。

float lerp = 0.1f; 
Vector3 position = this.getCamera().position; 
position.x += (Obj.x - position.x) * lerp * deltaTime; 
position.y += (Obj.y - position.y) * lerp * deltaTime; 
+16

建议:也可以与增量时间相乘以使运动与帧率无关。 – Mortennobel