2016-09-27 8 views
0

문제는 다음 게임입니다 : 내 게임은 1080x1920 픽셀 화면으로 제작되었지만 다른 해상도로 실행하면 배우의 위치가 전환됩니다. 당신이 이해하지 않은 경우Java - Libgdx : 액자의 위치를 ​​화면의 해상도 변경으로 유지하십시오.

일부 사진 :

~>original resolution

~>other resolution

은 내가 찾을 수 없습니다, 구글, 유래, 포럼에서 일 동안 대답을 보았다 당신은 하드 코드 된 값 이후의 모든 위치하는

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