2016-09-27 27 views
0

問題是下一個:我的遊戲是爲1080x1920像素屏幕構建的,但如果我在其他分辨率下運行它,我的演員的位置正在切換。Java - Libgdx:保持演員的位置,甚至屏幕的分辨率變化

,如果你不明白一些照片:

〜>original resolution

〜>other resolution

我找了一個答案几天在谷歌,#1,論壇,找不到我的問題的正確答案,這裏是我的代碼:

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

我添加了一個鏈接到github上的Scene2d頁面。在「視口」下查看,看看如何在Scene2d中使用視口。 – IronMonkey

0

發生這種情況,因爲不同的設備有不同的屏幕尺寸。所以它會顯示不同。爲了避免這種情況,您必須使用viewPort。爲了進一步說明,您必須閱讀關於多分辨率和視口的libgdx api。在這裏我會建議你一些示例代碼來避免這個多屏幕問題。請按照這種模式解決您的問題。

// 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