2014-01-22 7 views
6

Ich habe gerade angefangen, ein Spiel mit libgdx zu erstellen. Es ist ein Top-down-2D-Shooter mit scene2d ui. Nun dachte ich, dass ich einige Ebenen mit Dunkelheit und Licht ausstatten könnte, aber ich möchte nicht alles mit box2d neu schreiben. Ich brauche keine realistischen Schatten, nur irgendeine Art von Umgebungslicht und einen Lichtkreis um meinen Charakter herum, der nicht von Wänden und anderen Hindernissen umgeben ist. Also wollte ich wissen, ob es in libgdx irgendein Lichtsystem gibt? Oder kann ich box2dlights verwenden ohne box2d bodies/world ...? DankeLibgdx Licht ohne box2d

Antwort

6

Leider gibt es nichts dergleichen von LibGDX.

Aber Sie können es leicht selbst tun, wenn Sie keine Schatten wollen.

Here ist ein kleines Video von jemandem, der es über LibGDX getan hat. Here ist der Artikel zu diesem Video, mit Code und Beschreibungen und alles zur Verfügung gestellt. Sie können dies mit Shadern machen, aber Sie können dasselbe auch tun, indem Sie einfach eine Lightmap zu einem FBO rendern (in den gegebenen Links sehen Sie, wie das geht) und dann machen Sie es einfach so wie es bei der Mischung aktiviert ist oben auf dem Bildschirm. Der Standard SpriteBatch kann dies tun und Sie benötigen keine benutzerdefinierten Shader.

Wenn Sie immer noch echte Schatten mit Hindernissen haben wollen, werden Sie wahrscheinlich this Artikel sehr nützlich finden. Aber das ist viel langsamer und benötigt spezielle Shader.

Es gibt auch keine Möglichkeit, Box2dLights ohne Box2D btw zu verwenden.

+0

Danke für diese wirklich schnelle Antwort. Ich werde diesen Artikel so schnell wie möglich durchgehen. Vielen Dank! – Springrbua

+0

Ich denke, ich habe verstanden, wie es im Grunde funktioniert. In libgdx könnte ich die Zeichenmethode meiner Bühne verwenden und alles mit einer dunkelblauen, transparenten (Alpha = 0.7f oder so ähnlich) Farbe überschreiben, um Umgebungslicht hinzuzufügen? Aber wie kann ich dann dem Charakter das helle Licht hinzufügen? Danke – Springrbua

+0

Zuerst renderst du deine Szene auf die normale Art und Weise. Dann erstellen Sie einen FBO in der Größe Ihres Bildschirms, aber Sie setzen Ihre (Hintergrund-) Farbe z. B. auf (0,7, 0,7, 0,7, 1,0) (Umgebungsbeleuchtung). Danach zeichnest du alle deine Lichter auf diesem FBO, genau wie du etwas in deiner normalen Szene zeichnen würdest. Sie werden weiße Flecken auf einem dunkleren Hintergrund sein. Wenn Sie damit fertig sind, werden Sie den FBO mit Blending über Ihrer normalen Szene rendern. Alle Orte ohne Licht werden aufgrund der dunklen Umgebungsfarbe der FBO dunkler. Alle anderen werden heller (Lichter). – noone

20

Meiner Meinung nach ist die markierte Antwort falsch.

Es ist eigentlich ziemlich einfach zu box2dLights ohne box2d verwenden, wenn Sie keine Schatten wollen. Die Frage war, ob es möglich ist, eine Art Kreislicht um ein Zeichen herum hinzuzufügen.

Ich habe zwei verschiedene Ansätze verwendet, nur einen mit box2dlights.

Der Artikel in der markierten Antwort beschreibt eine Methode, die FBO verwendet. Das brauchst du nicht wirklich, wenn du nur einen Bereich aufhellen willst. U brauchen nur ein Sprite, wie this. legen Sie sie jetzt irgendwo auf ur-Bildschirm, und beim Rendern, wie folgt vorgehen:

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); 

Zunächst wird die Vermischungsfunktion geändert wird, so wir nicht nur das Sprite machen, aber mischen Sie sie in einer Beleuchtungs Art und Weise auf dem Hintergrund. Stellen Sie nach dem Zeichnen die Blend-Funktion auf normal zurück, damit alles andere danach wieder normal wiedergegeben wird. Das ist es.

Der zweite Ansatz verwendet box2dlights. Ja, wir brauchen ein box2d Weltobjekt, aber wir müssen nichts damit anfangen. Also was wir tun ist:

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); 

Zuerst erstellen wir unsere Welt, das tut nur nichts. Wir brauchen es nur für die zweite Aussage, wo wir unseren RayHandler erstellen, der unsere Lichter berechnet. In der dritten Anweisung setzen wir die Matrix des rayHandler. In diesem Fall benutze ich scene2d und benutze dafür die Stages camera combined matrix. Wenn Sie eine andere Kamera verwenden, verwenden Sie einfach die kombinierte Matrix. Die letzte Anweisung erstellt ein Pointlight mit dem rayHandler und beschreibt die Anzahl der Strahlen, die Lichtfarbe, ihren Radius und ihre Position.

Alles, was wir jetzt tun müssen, ist unsere Bühne oder Sprites in unserem machen zeichnen() -Methode und rufen

rayHandler.updateAndRender(); 

danach in dem Verfahren machen. Ziemlich einfach.

+0

Danke für Ihre Antwort, es ist sehr detailliert und klar! +1 – Springrbua

Verwandte Themen