2016-09-27 1 views
0

Le problème est le suivant: mon jeu est construit pour l'écran 1080x1920 pixels mais si je le lance dans d'autres résolutions, la position de mes acteurs change.Java - Libgdx: Conserver la position de l'acteur même les changements de résolution de l'écran

Quelques photos si vous ne l'avez pas compris:

~>original resolution

~>other resolution

je cherchais une réponse pour les jours dans Google, Stackoverflow, forums, n'a pas pu trouver le bonne réponse pour mon problème, voici mon code:

public class PlayScreen implements Screen { 

    private Main game; 

    private Stage stage; 

    Music music; 
    Sound sound; 




    private class MenuGame extends Actor { 
     Texture menu = new Texture(Gdx.files.internal("sprite/menu.png")); 

     @Override 
     public void draw(Batch batch, float alpha) { 
      batch.draw(menu, 0, 0,Gdx.graphics.getWidth(), Gdx.graphics.getHeight()); 
     } 
    } 

    private class NewGame extends Actor { 
     Texture newgame = new Texture(Gdx.files.internal("sprite/new.png")); 

     @Override 
     public void draw(Batch batch, float alpha) { 
      batch.draw(newgame, 350, 1000); 
     } 
    } 

    private class LoadGame extends Actor { 
     Texture loadgame = new Texture(Gdx.files.internal("sprite/load.png")); 

     @Override 
     public void draw(Batch batch, float alpha) { 
      batch.draw(loadgame, 350, 830); 
     } 
    } 

    private class CreditsGame extends Actor { 
     Texture creditsgame = new Texture(Gdx.files.internal("sprite/credits.png")); 

     @Override 
     public void draw(Batch batch, float alpha) { 
      batch.draw(creditsgame, 350, 660); 
     } 
    } 

    private class DonsGame extends Actor { 
     Texture donsgame = new Texture(Gdx.files.internal("sprite/dons.png")); 

     @Override 
     public void draw(Batch batch, float alpha) { 
      batch.draw(donsgame, 350, 490); 
     } 
    } 


    // our create() 

    public PlayScreen(final Main game) { 
     this.game = game; 


     Gdx.input.setInputProcessor(stage); 

     final Sound sound = Gdx.audio.newSound(Gdx.files.internal("sound/buttonsound.mp3")); 

     music = Gdx.audio.newMusic(Gdx.files.internal("sound/brun.mp3")); 
     music.setLooping(true); 
     music.setVolume(0.2f); 
     music.play(); 




     // actors 

     MenuGame menu = new MenuGame();  // BACKGROUND 
     stage.addActor(menu); 

     final NewGame newGame = new NewGame(); // BOUTON NEW 
     stage.addActor(newGame); 
     newGame.setX(350); 
     newGame.setY(1000); 
     newGame.setWidth(410); 
     newGame.setHeight(100); 


     LoadGame loadGame = new LoadGame(); // BOUTON LOAD 
     stage.addActor(loadGame); 
     loadGame.setX(350); 
     loadGame.setY(830); 
     loadGame.setWidth(410); 
     loadGame.setHeight(100); 

     CreditsGame creditsGame = new CreditsGame(); // BOUTON CREDITS 
     stage.addActor(creditsGame); 
     creditsGame.setX(350); 
     creditsGame.setY(660); 
     creditsGame.setWidth(410); 
     creditsGame.setHeight(100); 

     DonsGame donsGame = new DonsGame(); // BOUTON DONS 
     stage.addActor(donsGame); 
     donsGame.setX(350); 
     donsGame.setY(490); 
     donsGame.setWidth(410); 
     donsGame.setHeight(100); 






     // actions 

     newGame.addListener(new ClickListener() { 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) // NEW BOUTON ACTION 
      { 
       sound.play(0.2f); 
       music.stop(); 
       game.setScreen(new Story(game)); 
       return true; 
      } 
     }); 


     loadGame.addListener(new ClickListener() { 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) // LOAD BOUTON ACTION 
      { 
       sound.play(0.2f); //faire un truc ici 
       return true; 
      } 

     }); 




     creditsGame.addListener(new ClickListener() { 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) // CREDITS BOUTON ACTION 
      { 
       sound.play(0.2f);//faire un truc ici 
       return true; 
      } 
     }); 


     donsGame.addListener(new ClickListener() { 
      public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) // DONS BOUTON ACTION 
      { 
       sound.play(0.2f);//faire un truc ici 
       return true; 
      } 
     }); 


    } 



    @Override 
    public void show() { 
    } 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     stage.draw(); 

    } 

    @Override 
    public void resize(int width, int height) { 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 
     music.dispose(); 
     sound.dispose(); 
    } 

} 

Répondre

1

Vous positionnez tout après les valeurs codées en dur. Donc maintenant votre jeu dépend de la résolution.

Ce que vous devez utiliser est Viewports. Voici quelques liens pour vous aider à démarrer:

Brent Aureli - Aspect Ratios & Viewports

libgdx github - viewports

libgdx github - scene2d

+0

J'ai déjà scène tout cela le problème est: Je ne peux pas faire mes photos touchable si elles sont simples sprites, je devais les transformer en acteurs pour leur attribuer la manière d'être des boutons, c'est pourquoi c'est dur car mes acteurs sont représentés en boutons mais si vous changez de résolution ils bougent: je veux savoir comment faire avec les acteurs, pas avec sprites simples –

+0

J'ai ajouté un lien vers la page Scene2d sur github. Regardez sous "Viewport" pour voir comment vous utilisez les viewports avec Scene2d. – IronMonkey

0

ce qui se passe parce que différents périphériques a différentes tailles d'écran. donc ça va apparaître différemment. Pour éviter cela, vous devez utiliser viewPort. Pour plus de précisions, vous devez lire l'API libgdx à propos de la résolution multiple et du viewPort. ici je vais vous suggérer un exemple de code pour éviter ce problème multi-écran. S'il vous plaît suivez ce modèle qui a résolu votre problème.

// in your main class 
public class myGame extends ApplicationAdapter { 

    public OrthographicCamera camera 
    public Viewport viewPort 
    private SpriteBatch batch; 
    private BitMapFont myScoreFont 
    public myGame() { 

    } 

    @Override 
    public void create() { 
      myScoreFont = new BitmapFont(Gdx.files.internal(font.txt), true); 
     batch = new SpriteBatch(); 
     float w = Gdx.graphics.getWidth(); 
     float h = Gdx.graphics.getHeight(); 

     camera = new OrthographicCamera(); 
     camera.position.set(0, 0, 0); 
     camera.update(); 
     camera.setToOrtho(false, Constants.APP_WIDTH, Constants.APP_HEIGHT); 
     viewPort = new FillViewport(1280, 800, camera); 


    } 

    @Override 
    public void dispose() { 
     batch.dispose(); 
    } 



    @Override 
    public void render() { 
     Gdx.gl.glClearColor(1, 1, 1, 1); 
     Gdx.gl.glClear(GL30.GL_COLOR_BUFFER_BIT); 
     float deltaTime = Gdx.graphics.getDeltaTime(); 
     batch.setProjectionMatrix(camera.combined); 
     batch.begin(); 
     myScoreFont.draw(batch,"myText",0,0) 
     batch.end(); 

    } 

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

    @Override 
    public void pause() { 
    } 

    @Override 
    public void resume() { 
    } 
} 

pour plus de détails, vous devez lire le lien ci-dessous à propos de la fenêtre

https://libgdx.badlogicgames.com/nightlies/docs/api/com/badlogic/gdx/utils/viewport/FillViewport.html