2017-08-23 2 views

Antwort

1

Wie Sie sagten, Sie wollen jede Ansicht haben ihr eigenes Koordinatensystem so splitting the screen technique wie beantwortet von Julian wird den Trick tun, aber es ist nicht alles richtig zu verwenden.

Um es voll funktionsfähig zu machen, sollten Sie 2 separate OrthographicCamera eine für Spiel Draw-Ansicht, und eine andere für die Kontrolle anzeigen. Ich schlage vor, auch 2 Viewport Mapping zu jeder Kamera zu erstellen. Meiner Erfahrung nach, wenn Sie in einer Situation mit mehreren Kameras arbeiten, erstellen Sie immer den Associate Viewport dafür. Besser für Änderungen, die in der Zukunft einführen könnte (dh an jede Bildschirmauflösung anpassen), Debugging Zweck wie Berühren, Position etc.

Kombinieren Sie so Splitting-Technik mit Kamera/Viewport-Management, Sie haben robuste System für jeden arbeiten Bereich unabhängig.

-Code

bereitgestellt ich den folgenden Code, wie es verwendet wird und in meinem Spiel zu arbeiten, aber geändert Variablennamen Ihren Bedarf zu passen. Es ist in Kotlin, sollte aber relativ einfach als Java zu sehen sein. Sie initialisieren die Dinge zuerst für Spielbereich Sachen.

// create a camera 
gameAreaCamera = OrthographicCamera() 
gameAreaCamera.setToOrtho(false, GAME_WIDTH, GAMEVIEW_HEIGHT) 
gameAreaCamera.update() 

// create a viewport associated with camera 
gameAreaViewport = ExtendViewport(GAME_WIDTH, GAMEVIEW_HEIGHT, gameAreaCamera) 

Als nächstes für die Kontrolle Bereich Sachen.

// create a camera 
controlAreaCamera = OrthographicCamera() 
controlAreaCamera.setToOrtho(false, GAME_WIDTH, CONTROLVIEW_HEIGHT) 
controlAreaCamera.update() 

// create a viewport associated with camera 
controlAreaViewport = ExtendViewport(GAME_WIDTH, CONTROLVIEW_HEIGHT, controlAreaCamera) 

PS: Breite und Höhe Hinweis jeder Ansicht. Es ist festgelegt, um Bereich gemäß Ihrer Absicht zu besetzen.

Jetzt sollten Sie so etwas in render() Methode haben.

override fun render() { 
    // clear screen 
    Gdx.gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) 
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT) 

    // draw game area 
    drawGameArea() 
    // draw control area 
    drawControlArea() 
} 

Für Ihre drawGameArea() davon ausgehen, dass sb ist Ihr SpriteBatch, dass Sie es in der aktuellen Klasse halten,

private fun drawGameArea() { 
    // the following twos to let system know we will operate against game area's camera 
    // set the projection matrix 
    sb.projectionMatrix = gameAreaCamera.combined 
    // set gl viewport 
    Gdx.gl.glViewport(0,0,GAME_WIDTH, GAMEVIEW_HEIGHT) 

    // draw your stuff here... 
    sb.begin() 
    ... 
    sb.end() 
} 

Das wäre für drawControlArea() auf die gleiche Art und Weise geht

private fun drawControlArea() { 
    // the following twos to let system know we will operate against control area's camera 
    // set the projection matrix 
    sb.projectionMatrix = controlAreaCamera.combined 
    // set gl viewport 
    Gdx.gl.glViewport(0,GAMEVIEW_HEIGHT,GAME_WIDTH, CONTROLVIEW_HEIGHT) 

    // draw your stuff here... 
    sb.begin() 
    ... 
    sb.end() 
} 

Hinweis Gdx.gl.glViewport() wir liefern es mit einem Zielrechteckbereich, um Dinge zu zeichnen. Viewport s werden nicht direkt verwendet, aber es ist mehr, um dem System zu sagen, welche Art von Bildschirm Größenanpassung Strategie, um die Grafik Ihres Spiels in Bildschirm und für bessere Debugging-Zwecke passen. Sie können mehr lesen here.

Zwei häufig verwendete Optionen, die Sie am häufigsten verwenden, sind ExtendViewport und FitViewport. Wenn Sie möchten, dass das Spiel erscheint und den gesamten Bildschirmbereich abdeckt, ohne das Seitenverhältnis zu beeinflussen, ohne schwarze Balken (schwarz auf der linken oder rechten Seite), ist ExtendViewport wahrscheinlich das, was Sie wollen oder wenn Sie möchten der ähnliche Effekt, aber mit Black-Bars so Spiel-Bildschirm wird für jeden Spieler gleich sein (also keinen Vorteil gegenüber Spieler mit Breitbild) dann FitViewport ist Ihre Wahl.

On UI Hit Checking

Ich denke, Sie dies benötigen, also sollte ich es schließen. Wann immer Sie überprüfen müssen, ob ein solches UI-Element vom Benutzer angeklickt (oder angetippt) wird, können Sie in der entsprechenden update() Methode Folgendes überprüfen: Ob die Berührungsposition innerhalb des Begrenzungsbereichs des Objekts liegt oder nicht.

Der folgende Code sicher und arbeitet sehr gut mit ExtendViewport, aber es sollte auch das gleiche mit anderen Viewport arbeitet, wie der Code keine spezifische Informationen von ExtendViewport erforderlich macht. Es ist also generisch.

fun update(dt: Float, cam: Camera: viewport: Viewport) { 
    // convert screen coordinate to world coordinate 
    val location = Vector3(Gdx.input.getX(), Gdx.input.getY(), 0f) 
    cam.unproject(location, viewport.screenX.toFloat(), viewport.screenY.toFloat(), viewport.screenWidth.toFloat(), viewport.screenHeight.toFloat()) 

    if ((Gdx.input.isTouched() && 
    boundingRect.contains(location.x, location.y)) { 
     // do something here... 
    } 
} 
0

Sie können zwei Kameras verwenden und sie wie in Ihrem Bild gezeigt positionieren. Ich denke, dieser Beitrag könnte Ihnen einen Hinweis geben: Split-Screen in LibGDX

Verwandte Themen