2016-05-23 2 views
0

Pour pratiquer mes compétences Java, j'ai développé un jeu de base sur les serpents. Avec Java, j'utilise LibGDX et Scene2d pour gérer tous mes objets.Scène 2D Séparation des coordonnées du point de vue et des coordonnées du jeu

À l'heure actuelle, les limites du jeu de serpent sont définies pour les dimensions de la fenêtre. Les collisions sont vérifiées chaque fois que le serpent atteint l'extérieur de la fenêtre. J'utilise une fenêtre d'affichage qui est incorporée dans la scène comme indiqué ci-dessous.

private AudioSnake gameCore; 
private Stage gameStage; 
private Image background; 
private Image snakeTip; 
private Image food; 
private ArrayList<Image> snakeTail = new ArrayList <Image>(); // all the snake tail bits 
private ScreenViewport viewport; 

public GameScreen(AudioSnake audioSnake) { 
    gameCore = audioSnake; 
    viewport = new ScreenViewport(); 
    gameStage = new Stage(viewport); 
    Gdx.input.setInputProcessor(gameStage); 
    uiSkin = new Skin(Gdx.files.internal("Ui/uiskin.json")); 
    scoreLabel = new Label(String.format("%.0f",score),uiSkin); 
    generateUi(); 
    generateFood(); 
} 

code de contrôle de collision:

public void collisionCheck(){ // method that checks rather the snake head is touching outside the border, or inside it's own body 
    if(snakeTip.getX() >= gameStage.getWidth() || snakeTip.getY() >= gameStage.getHeight() || snakeTip.getX() <= 0 || snakeTip.getY() <= 0){ 
     System.out.println("death activated"); 
     activateDeath(); 
    } 
    else{ 
     for(int i = 0; i < snakeTail.size(); i++){ 
      if(snakeTip.getX() == snakeTail.get(i).getX() && snakeTip.getY() == snakeTail.get(i).getY()){ 
       System.out.println("death activated"); 
       activateDeath(); 
      } 
     } 
    } 
} 

Le gros problème est que les mécanismes de jeu sont grandement affectées par la taille de l'écran. Ce que JE VEUX avoir, c'est une zone virtuelle dans laquelle le serpent se déplace (presque comme son propre système de coordonnées) qui est séparée de la fenêtre. En ce qui concerne la fenêtre d'affichage, je préférerais qu'il reste une fenêtre d'affichage si possible. Quelle serait la meilleure façon de faire cela?

Répondre

1

ScreenViewport n'est pas bon ici parce que votre jeu serait par exemple beau sur l'écran de smaprtphone quand il s'agirait d'un petit polygone au centre de la tablette. Vous devriez plutôt envisager d'utiliser FitViewport qui ajoutera une barre à votre écran mais permettra de garder la même taille d'arène pour chaque appareil.

Pour définir la résolution de votre écran virtuel devrait avoir juste passer dans le constructeur

private FitViewport viewport; 

    public GameScreen(AudioSnake audioSnake) { 
     gameCore = audioSnake; 
     viewport = new ScreenViewport(SCREEN_WIDTH_IN_PX, SCREEN_HEIGHT_IN_PX); 
     gameStage = new Stage(viewport); 

de la fenêtre, alors vous devez également remplacer la méthode resize() pour rendre votre fenêtre actualisable

@Override 
    public void resize(int width, int height) { 
     viewport.update(width, height); 
    } 

également dans votre méthode render() vous devez appliquer la fenêtre avant de rendre la scène

viewport.apply(); 
    stage.act(delta); 
    stage.draw(); 

Après tout cela au lieu de gameStage.getWidth() vous pouvez utiliser simplement votre commande SCREEN_WIDTH_IN_PX

+0

Merci! J'ai suivi votre conseil et suis allé avec la fenêtre d'ajustement –