Comme vous avez dit que vous voulez chaque vue d'avoir son propre système de coordonnées ainsi que splitting the screen technique répondu par Julian fera l'affaire, mais il est pas tout à l'utiliser correctement.
Pour que cela fonctionne pleinement, vous devez avoir 2 vues séparées pour OrthographicCamera
pour la vue de mise en jeu, et une autre pour la vue de contrôle. Je suggère également de créer 2 Viewport
cartographie à chaque caméra ainsi. Dans mon expérience, lorsque vous travaillez dans plusieurs cas de la caméra, créez toujours associé Viewport
pour elle.
Donc, combinez la technique de séparation avec la gestion de caméra/viewport, vous aurez un système robuste pour travailler à chaque fois que vous le souhaitez. zone indépendamment.
code
Je fourni le code suivant comme il est utilisé et travailler dans mon jeu, mais a changé de nom variable pour répondre à vos besoins. C'est à Kotlin, mais devrait être relativement facile de le voir comme Java. Vous initialisez les choses en premier pour les éléments de la zone de jeu.
// 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)
Ensuite, pour la zone de contrôle.
// 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: largeur de l'Avis et la hauteur de chaque point de vue. Il est prévu d'occuper la zone selon votre intention.
Maintenant vous devriez avoir quelque chose comme ça dans la méthode render()
.
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()
}
Pour votre drawGameArea()
supposer que sb
est votre SpriteBatch
que vous maintenez dans la classe actuelle,
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()
}
Ce serait va de même pour drawControlArea()
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()
}
Remarque Gdx.gl.glViewport()
nous lui fournissons la zone rectangle cible pour dessiner les choses. Viewport
s ne sont pas directement utilisés, mais il est plus de dire au système quel type d'écran stratégie de redimensionnement pour entrer dans l'écran de graphique de votre jeu, et pour une meilleure fin de débogage. Vous pouvez lire plus here.
Deux options fréquemment utilisées que vous utiliserez le plus sont ExtendViewport
et FitViewport
. Si vous voulez que le jeu à paraître et couvrir la zone entière de l'écran sans affecter rapport d'aspect sans barres noires (noir sur le côté gauche ou côté droit), ExtendViewport
est susceptible d'être ce que vous voulez, ou si vous voulez l'effet similaire, mais avec un écran noir-barres jeu ainsi sera le même pour tous les joueurs (donc fournir aucun avantage sur joueur avec grand écran), puis FitViewport
est votre choix.
Vérification cognent Sur l'interface utilisateur
Je suppose que vous en aurez besoin, donc je devrais inclure aussi. Chaque fois que vous devez vérifier si tel élément de l'interface utilisateur est cliqué (ou tapé) par l'utilisateur, alors vous pouvez avoir ce qui suit dans sa méthode update()
correspondant pour vérifier si toucher position dans les limite de la zone de délimitation de cet objet ou non.
Le code suivant en toute sécurité et fonctionnent très bien avec ExtendViewport
, mais il devrait également fonctionner même avec d'autres Viewport
que le code ne nécessite pas d'informations spécifiques de ExtendViewport
. C'est générique.
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...
}
}