2016-09-27 2 views
0

вопрос следующий: моя игра построена для экрана 1080x1920 пикселей, но если я запустил ее в других разрешениях, положение моих актеров переключится.Java - Libgdx: сохраняйте положение актера даже при разрешении экрана экрана

Некоторые фотографии, если вы не поняли:

~>original resolution

~>other resolution

Я искал ответ в течение нескольких дней в Google, Stackoverflow, форумах, не смог найти правильный ответ для моей проблемы, вот мой код:

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(); 
    } 

} 

ответ

1

Вы позиционируете все после жестко заданных значений. Так что прямо сейчас ваша игра зависит от разрешения.

Что вам нужно использовать, это видовые экраны. Вот несколько ссылок, чтобы вы начали:

Brent Aureli - Aspect Ratios & Viewports

libgdx github - viewports

libgdx github - scene2d

+0

У меня уже есть сцена все это проблема: я не могу получить мои фотографии осязаемыми, если они простые спрайты, я должен был превратить их в актеров, чтобы они соответствовали им как кнопки, вот почему это сложно, потому что я нарисовал кнопки на моих актерах, но если вы измените разрешение, они двигаются: я хочу знать, как делать с актерами, а не с простые спрайты –

+0

Я добавил ссылку на страницу Scene2d на github. Посмотрите в разделе «Просмотр», чтобы узнать, как использовать видовые экраны с помощью Scene2d. – IronMonkey

0

это происходит потому, что различные устройства имеет другой размер экрана. так что это будет выглядеть по-другому. Чтобы избежать этого, вы должны использовать viewPort. Для получения более подробных сведений вы должны прочитать libgdx api о множественном разрешении и viewPort. здесь я предложу вам пример кода, чтобы избежать этой проблемы с несколькими экранами. пожалуйста, следуйте этому шаблону, который поможет решить вашу проблему.

// 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() { 
    } 
} 

для получения более подробной информации вы должны прочитать ниже ссылку о видовом

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