2016-09-27 4 views
0

問題は次のものです:私のゲームは1080x1920ピクセルの画面用に作られていますが、他の解像度で実行すると、あなたが理解していない場合Java - Libgdx:俳優の位置を画面の解像度に合わせて変更する

いくつかの写真:

〜>original resolution

〜>other resolution

は私が見つけることができませんでした、グーグル、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

githubのScene2dページへのリンクを追加しました。 「ビューポート」の下を見て、Scene2dでビューポートをどのように使用するかを確認します。 – IronMonkey

0

。それは異なって現われるでしょう。これを避けるには、viewPortを使用する必要があります。マルチ解像度と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

関連する問題