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...
}
}