2012-11-05 60 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