2017-08-23 4 views

Répondre

1

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

Vous pouvez utiliser deux caméras et les positionner comme indiqué sur l'image. Je pense que ce poste pourrait vous donner un indice: Split-Screen in LibGDX