2016-10-01 154 views
0

我試圖用可點擊的播放和退出標籤製作一個簡單的主菜單,但可點擊區域始終位於標籤上方。點擊「播放」標籤我需要點擊它上面的20個像素。libgdx點擊目標上方的區域

如何將可點擊區域與標籤對齊?

還有就是我MainMenuButton類

public class MainMenuButtons { 
    private MainGame game; 
    private Stage stage; 
    private Viewport gameViewport; 

    private Label mainGameLabel, playLabel, exitLabel; 

    public MainMenuButtons(MainGame game) { 
     this.game = game; 

     gameViewport = new FillViewport(GameInfo.WIDTH, GameInfo.HEIGHT, new OrthographicCamera()); 
     stage = new Stage(gameViewport, game.getBatch()); 
     Gdx.input.setInputProcessor(stage); 


     createLabelsAndButtons(); 
     addAllListeners(); 

     Table menuTable = new Table(); 
     menuTable.center().center(); 
     menuTable.setFillParent(true); 
     menuTable.add(playLabel); 
     menuTable.row(); 
     menuTable.add(exitLabel).padTop(40); 


     Table gameTitle = new Table(); 
     gameTitle.center().top(); 
     gameTitle.setFillParent(true); 
     gameTitle.add(mainGameLabel).padTop(40); 

     menuTable.debug(); 
     stage.addActor(menuTable); 
     stage.addActor(gameTitle); 

    } 

    void createLabelsAndButtons() { 
     FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("Fonts/PressStart2P.ttf")); 
     FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter(); 
     parameter.size = 45; 

     BitmapFont font = generator.generateFont(parameter); 
     mainGameLabel = new Label("Road Racer", new Label.LabelStyle(font, Color.WHITE)); 


     parameter.size = 25; 

     font = generator.generateFont(parameter); 
     playLabel = new Label("Play", new Label.LabelStyle(font, Color.WHITE)); 
     exitLabel = new Label("Exit", new Label.LabelStyle(font, Color.WHITE)); 
    } 

    void addAllListeners() { 

     playLabel.addListener(new ClickListener(){ 

      @Override 
      public void clicked(InputEvent event, float x, float y) { 
       super.clicked(event, x, y); 
       System.out.println("Play label clicked " + y); 
//    game.setScreen(new GamePlay(game)); 
      } 
     }); 

     exitLabel.addListener(new ClickListener(){ 

      @Override 
      public void clicked(InputEvent event, float x, float y) { 
       super.clicked(event, x, y); 
       System.out.println("Exit label clicked " + y); 
//    Gdx.app.exit(); 
      } 
     }); 



    } 

    public Stage getStage() { 
     return this.stage; 
    } 


} 

,我把它叫做在MainMenu的類

/** 
* Created by vladk on 24/09/16. 
*/ 
public class MainMenu implements Screen { 

    private MainGame game; 
    private OrthographicCamera mainCamera; 
    private Viewport gameViewport; 

    private MainMenuButtons btns; 

    public MainMenu(MainGame game) { 
     this.game = game; 

     mainCamera = new OrthographicCamera(); 
     mainCamera.setToOrtho(false, GameInfo.WIDTH, GameInfo.HEIGHT); 
     mainCamera.position.set(GameInfo.WIDTH/2f, GameInfo.HEIGHT/2f, 0); 

     gameViewport = new StretchViewport(GameInfo.WIDTH, GameInfo.HEIGHT, mainCamera); 

     // background ?? 

     // buttons 
     btns = new MainMenuButtons(game); 
    } 


    @Override 
    public void show() { 

    } 

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

//  game.getBatch().begin(); 
//  game.getBatch().end(); 

     game.getBatch().setProjectionMatrix(btns.getStage().getCamera().combined); 
     btns.getStage().draw(); 
     btns.getStage().act(); 
    } 

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

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void dispose() { 
     // bg 
     // buttons 
     btns.getStage().dispose(); 
    } 
} 

回答

0

我找到了解決辦法。我需要更新的MainMenuButtons視口,所以我創建了一個新的方法

// in the MainMenuButtons class 
public void viewportUpdate(int width, int height) { 
    gameViewport.update(width, height); 
} 

,如果從MainMenu的類調用

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