2013-08-20 6 views
9

Ich habe versucht, dieses Problem für zwei Tage zu lösen, und ich habe es aufgegeben, eine vorhandene Lösung zu finden.Mehrere Kameras in libgdx (wahrscheinlich ähnlich in anderen Frameworks)

Ich habe angefangen zu lernen libgdx und beendete ein paar Tutorials. Und jetzt habe ich versucht, alles, was ich gelernt habe, zu verwenden und ein einfaches Side Scrolling-Spiel zu erstellen. Nun, ich weiß, dass es libgdx-Beispiele dafür gibt, aber ich habe keinen gefunden, der Box2d mit scene2d und Schauspielern sowie gekachelten Karten enthält.

Mein Hauptproblem ist mit den Kameras.

Sie benötigen eine Kamera für die Bühne (die soweit ich weiß, für die Projektionsmatrix der Spritebatch verwendet wird, um die Methode draw() übergeben an Schauspieler, wenn dies falsch ist bitte korrigieren Sie mich), und Sie benötigen eine Kamera für den TileMapRender zum Aufrufen der render() -Methode. Außerdem gibt es in einigen Tutorials eine OrthographicCamera im GameScreen, die bei Bedarf verwendet wird.

Ich habe versucht, ein OrthographicCamera-Objekt Methoden zu übergeben, ich habe versucht, die Kamera von der Bühne und die Kamera vom TileMapRenderer überall zu verwenden. Bsp.

OrthographicCamera ocam = new OrthographicCamera(FRUSTUM_WIDTH, FRUSTUM_HEIGHT); 
stage.setCamera(ocam); // In the other cases i replace ocam with stage.getCamera() or the one i use for the tileMap Render 
tileMapRenderer.render(ocam); 
stage.getSpriteBatch().setProjectionMatrix(ocam.combined); // I am not sure if this is needed 

Ich habe auch versucht, verschiedene Kameras überall zu verwenden.

Nachdem all dies versucht habe ich nicht bemerkt, was genau passiert, wenn aber ich werde Liste, was passiert:

  • Es gibt nichts auf dem Bildschirm (Wahrscheinlich ist die Kamera weg von dem Zeug, das gezogen wird)
  • Ich kann die gekachelte Karte und die Konturen vom debugRenderer sehen (Ich benutze auch debugRender, aber ich denke nicht, dass es die Kameras stört), aber das Sprite des Schauspielers ist nicht sichtbar (wahrscheinlich außerhalb des Bildschirms)
  • Ich kann alles sehen, was ich sollte, aber wenn ich versuche, den Schauspieler und die Kamera, die ihm folgen soll, zu bewegen, sp Ritus geht schneller als der Körper (das grüne Debug-Quadrat).

Also meine Hauptfragen sind:

  • Ich verstehe nicht, was passiert, wenn Sie mehrere Kameras haben. "Durch" welche siehst du eigentlich auf dem Montior?
  • Sollte ich mehrere Kameras verwenden und wie?

Auch ich dachte, dass ich erwähnen sollte, dass ich OpenGL ES 2.0 verwende.

Es tut mir leid für die lange Frage, aber ich dachte, dass ich im Detail beschreiben sollte, da es ein bisschen kompliziert für mich ist.

+0

genannt haben Sie stage.act() & stage.draw(), um die Bühne zu machen –

Antwort

16

Sie sehen tatsächlich alle gleichzeitig durch. Sie mögen zwar eine völlig andere Welt sehen, aber alle rendern ihre Sicht auf den Bildschirm. Sie können mehrere Kameras oder nur eine verwenden. Wenn Sie nur einen verwenden, müssen Sie sicherstellen, dass Sie die Projektionsmatrix korrekt aktualisieren, zwischen dem Zeichnen der TiledMap, Ihrer Bühne mit Akteuren und möglicherweise dem optionalen Box2DDebugRenderer.

Ich würde eine extra Kamera für den Box2DDebugRenderer verwenden, weil Sie es später einfach wegwerfen können. Ich nehme an, Sie verwenden einen Umrechnungsfaktor, um Meter in Pixel umzuwandeln und umgekehrt.Ein Verhältnis von 1: 1 zu haben wäre nicht sehr gut. Ich habe immer etwas zwischen 1m = 16px und 1m = 128px verwendet.

So initialisieren Sie es auf diese Weise, und verwenden Sie diese für Ihre Debug-Renderer:

OrthographicCamera physicsDebugCam = new OrthographicCamera(Gdx.graphics.getWidth()/Constants.PIXEL_PER_METER, Gdx.graphics.getHeight()/Constants.PIXEL_PER_METER); 

Für Ihre TiledMapRenderer Sie auch eine zusätzliche Kamera verwenden kann, sondern dass man nur in Bildschirm-Koordinaten arbeiten, so dass keine Konvertierung:

OrthographicCamera tiledMapCam = new OrthographicCamera(Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 

Die TiledMap wird immer bei gemacht werden (0, 0). Sie müssen also die Kamera verwenden, um sich auf der Karte zu bewegen. Es wird wahrscheinlich einen Körper folgen, so können Sie es über aktualisieren:

tiledMapCam.position.set(body.getPosition().x * Constants.PIXELS_PER_METER, body.getPosition().y * Constants.PIXELS_PER_METER) 

Oder im Fall folgt ein Schauspieler:

tiledMapCam.position.set(actor.getX(), actor.getY()) 

Ich habe eigentlich nicht scene2d zusammen mit Box2D noch verwendet, weil ich Ich musste nicht sehr viel mit meinen Spielobjekten interagieren. Sie müssen hier einen benutzerdefinierten PhysicsActor implementieren, der Actor erweitert und die Brücke von scene2d zu Box2D erstellt, indem ein Body als Eigenschaft verwendet wird. Es muss die Actor-Position, Rotation usw. basierend auf dem Body bei jedem Update-Schritt setzen. Aber hier haben Sie mehrere Möglichkeiten. Sie können die tiledMapCam erneut verwenden und in Bildschirmkoordinaten arbeiten. In diesem Fall müssen Sie immer daran denken, mit Konstanten.PIXELS_PER_METER zu multiplizieren, wenn Sie Ihren Akteur aktualisieren. Oder Sie verwenden eine andere Kamera mit der gleichen Ansichtsfenster wie die physicsDebugCam. In diesem Fall ist keine Konvertierung erforderlich, aber ich bin mir nicht sicher, ob dies einige scene2d-spezifische Dinge beeinträchtigen könnte.

Für eine ParallaxBackground Sie auch eine andere Kamera verwenden können, für UI Sie eine andere Stufe und eine andere Kamera wieder verwenden können ... oder andere wiederverwenden, indem sie richtig zurückzusetzen. Es ist deine Entscheidung, aber ich denke, dass mehrere Kameras die Leistung nicht sehr beeinflussen. Weniger Zurücksetzen und Konvertierungen könnten es sogar verbessern.

Nachdem alles eingerichtet ist, müssen Sie nur alles rendern, mit den richtigen Kameras und rendern jede "Schicht"/"Ansicht" übereinander. Zuerst ein ParallaxBackground, dann deine Tiledmap, dann deine Entity-Stage, dann deine Box2DDebugging-View und dann deine UI-Stage.

Im Allgemeinen erinnern Sie sich daran, spriteBatch.setProjectionMatrix(cam.combined); anrufen und cam.update() verwenden, nachdem Sie etwas von Ihrer Kamera geändert.

+0

ich ein ähnliches Problem haben; Ich rende eine gekachelte Karte mit einer benutzerdefinierten Einheit und einer Projektion (als Teil einer Bühne), und ich möchte darüber hinaus eine Debug-Benutzeroberfläche mit Text wie FPS rendern. Aber selbst wenn ich eine separate "OrthographicCamera" für die Debug-Benutzeroberfläche verwende und diese auf den Bildschirm w/h decke und auf den Sprite-Stapel zum Rendern des Textes setze, wird es in Bezug auf die Map-Grenzen gerendert, nicht auf meinem Bildschirm Grenzen. Muss ich nach dem Aufruf von stage.draw() und vor debugUi.render() etwas zurücksetzen, um dies zu verhindern? Ich muss etwas verpassen. – Matthias

+0

@Matthias Bitte erstellen Sie eine neue Frage mit dem entsprechenden Code. – noone

+0

sicher: http://stackoverflow.com/questions/26936952/resetting-the-viewport-after-creating-rendering-a-scene2d-stage – Matthias