2013-09-24 272 views
0

我目前正在開發一款帶有LWJGL的2D RPG,並且仍處於開發階段。我有很多我想創建的技術,但我的一個重大問題是將相機固定在播放器上。我所看到的所有解決方案都涉及讓世界移動並保持球員靜止不動,但這似乎很明顯,如果不加以嚴密監控,這可能會導致一些計算問題。通常情況下,我會寫一個系統,我不必擔心它,但是我拒絕了,因爲我最終打算添加多人遊戲功能,在那裏移動的世界將無法播放。2D移動攝像頭(LWJGL)

有沒有辦法將相機固定到可以移動而無需使用翻譯來移動世界的對象或點?另外,如果可能,我想避免使用Slick。這需要我重新修復我目前的遊戲引擎。

回答

0

無論何時您要將3d視口投影到2D屏幕上,都需要根據觀察者(所謂的相機或視圖)的角度來移動所有內容。

我想你不能逃避這一點。你通常做的是有一個Camera對象,該對象保存位置和旋轉,用於構建通過uniform傳遞到場景頂點的視圖矩陣到着色器。將變換矩陣傳遞給着色器是正常現象,所以你不應該感覺到它的負擔。您始終可以將其與透視矩陣相乘。

您必須將整個世界以匹配您的攝像頭的位置,因爲你需要的,因爲它是從這個角度來看看到在場景變換的一切,否則你怎麼會那麼其投影在屏幕上?沒有「移動相機,保持世界靜止」的概念。

+0

兩個問題:一,這是一個2D項目,所以我不知道你的3D知識有多少適用。二,如果這個世界移動了,如果每個玩家都圍繞它們移動世界而不是移動自己,那麼地球上的多人遊戲如何運作呢? – 2mac

0

移動世界視覺,這是每個其他RPG如何做到這一點。不要移動現實世界的位置。

通常根據玩家位置(即glTranslate2f(-player.x,-player.y))繪製除ui之外的所有內容。這一切都在渲染方法中完成。在聯網的多人遊戲中,視口是針對特定玩家完成的(即Bob的屏幕基於Bob的位置翻譯,Jane的翻譯基於Jane的位置)。如果你想要單屏多人遊戲,你可能不得不使用多重幀緩衝區(每個玩家一個),並將它們用作視口。

+1

我在'Display.update();'之前添加了'glTranslatef(-game.player.getX(), - game.player.getY(),0);'我的主要渲染方法,但沒有得到任何結果。玩家的位置被保持在這些方法中。 – 2mac

+0

glTranslatef應該在渲染播放器之前調用,而不是之後。您應該推送一個轉換矩陣glTranslatef(...),繪製世界和敵人和角色,彈出轉換矩陣,繪製UI,然後按照該順序調用Display.update()。 – DeadlyFugu