2014-01-22 188 views
6

我剛開始使用libgdx創建遊戲。這是一個使用scene2d UI的自上而下的2D射擊遊戲。現在我想,我可以在某些層次上添加黑暗和光明,但我不想用box2d重寫所有內容。我不需要逼真的陰影,只需要一些環境光線和一個光環圍繞我的角色,這不受圍牆周圍的牆壁和其他障礙的影響。所以我想知道libgdx中是否有任何類型的燈光系統?或者,我可以使用box2dlights而不使用box2d body/world ...?謝謝Libgdx light without box2d

回答

6

不幸的是,LibGDX已經提供了這樣的東西。

但是,如果你不想陰影,你可以輕鬆地自己做。

Here是通過LibGDX完成它的人的一個小視頻。 Here是此視頻的文章,其中包含代碼和說明以及所有提供的內容。 你可以用着色器這樣做,但你也可以通過向FBO渲染一個光照貼圖(在給定的鏈接中可以看到如何做到這一點)來做同樣的事情,然後按照通常的方式將其混合激活屏幕頂部。標準SpriteBatch可以做到這一點,你不需要任何自定義着色器。

如果您仍然想要帶有障礙物的真實陰影,您可能會發現this文章非常有用。但是這太慢了,需要特殊的着色器。

沒有Box2D btw也沒有辦法使用Box2dLights。

+0

感謝這個真正快速的答案。我會盡快完成這篇文章。謝謝! – Springrbua

+0

我想我明白它的基本工作原理。在libgdx中,我可以使用我的舞臺的繪製方法,並使用深藍色透明(Alpha = 0.7f或類似的東西)顏色來添加環境光?但是我怎麼才能給角色增加明亮的光線呢?謝謝 – Springrbua

+0

首先你以正常的方式呈現你的場景。然後,您創建一個屏幕大小的FBO,但您將(背景)顏色設置爲例如(0.7,0.7,0.7,1.0)(環境閃電)。之後,您可以在FBO上繪製所有燈光,就像在正常場景中繪製某些東西一樣。它們將成爲黑色背景上的白色斑點。完成後,您將在正常場景的頂部啓用混合渲染該FBO。由於fbo的黑暗環境顏色,所有沒有光線的地方會變暗。所有其他人會變得更加明亮(燈光)。 – noone

20

在我看來,標記的答案是錯誤的。

它實際上很簡單,使用box2dLights而不使用box2d,如果你不想要任何陰影。問題是,如果有可能在角色周圍添加某種圓形光線。

我使用了兩種不同的方法,只有一種使用box2dlights。

標記答案中的文章闡明瞭使用FBO的方法。如果你只是想要點亮一個區域,你真的不需要。你只需要一個精靈,比如this。現在把它放在烏爾屏幕上,並且渲染時,請執行下列操作:

batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA); 
theLightSprite.draw(batch, parentAlpha); 
batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 

首先混合功能被改變,所以我們不只是渲染精靈,但在背景上的照明方式融入它。繪製完成後,將混合函數重新設置爲normal,這樣之後的其他所有內容都會再次正常渲染。而已。

第二種方法使用box2dlights。是的,我們確實需要box2d世界對象,但我們不需要對它做任何事情。所以我們做的是:

world = new World(new Vector2(0,0),false); 
rayHandler = new RayHandler(world); 
rayHandler.setCombinedMatrix(stage.getCamera().combined); 
new PointLight(rayHandler,1000, Color.BLUE,radius,x_position,y_position); 

首先我們創造了我們的世界,那就是無所作爲。我們只需要它來創建我們的RayHandler來計算我們的燈光。在第三個聲明中,我們設置了rayHandler的矩陣。在這種情況下,我使用scene2d,並因此使用階段相機組合矩陣。如果你使用其他相機,只需在這裏使用其組合矩陣。最後一個聲明用rayHandler創建了一個點光源,描述了光線的數量,燈光的顏色,半徑和位置。

現在我們所要做的,就是把我們的舞臺或精靈在我們的render()方法,並調用

rayHandler.updateAndRender(); 

的渲染方法。挺容易。

+0

感謝您的回答,這是非常詳細和明確的! +1 – Springrbua