2015-07-16 3 views
0

У меня проблема с моим текущим проектом libGDX. Игра начинается с главного меню, где вы можете нажать на две кнопки. После запуска игры вы можете приостановить его через Esc и перейти к экрану паузы, который очень похож на главное меню. Я не знаю, почему, но кнопки на экране паузы не доступны. Вот код игрового экрана с проблемой:Кнопки libgdx не доступны для просмотра

public class GameScreen implements Screen{ 

    private Texture[] monsterTextures = {Assets.manager.get(("Ressources/DemonHunter.jpg"), Texture.class), Assets.manager.get(("Ressources/WingedDemon.jpg"), Texture.class), 
             Assets.manager.get(("Ressources/Viking.jpg"), Texture.class), Assets.manager.get(("Ressources/DemonWarrior.jpg"), Texture.class)}; 
    private Image[] monsterImages = {new Image(monsterTextures[0]), new Image(monsterTextures[1]), new Image(monsterTextures[2]), new Image(monsterTextures[3])}; 
    private Stage gameStage = new Stage(), pauseStage = new Stage(); 
    private Table table = new Table(); 
    private Skin menuSkin = Assets.menuSkin; 
    private TextButton buttonContinue = new TextButton("Continue", menuSkin), 
         buttonExit = new TextButton("Exit", menuSkin); 
    private Label title = new Label ("Game", menuSkin); 
    private int randomMonster; 
    private int currentMonsterLife = 1 + (int)(Math.random() * ((5-1) + 1)); 

    public static final int GAME_CREATING = 0; 
    public static final int GAME_RUNNING = 1; 
    public static final int GAME_PAUSED = 2; 
    private int gamestatus = 0; 


    @Override 
    public void show() { 

     randomMonster = 0 + (int)(Math.random() * ((3-0) + 1)); 
     gameStage.addActor(monsterImages[randomMonster]); 

    } 

    public void newMonster() { 
     monsterImages[randomMonster].remove(); 
     Gdx.gl.glClearColor(0,0,0,1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     randomMonster = 0 + (int)(Math.random() * ((3-0) + 1)); 
     currentMonsterLife = 1 + (int)(Math.random() * ((5-1) + 1)); 
     gameStage.addActor(monsterImages[randomMonster]); 
    } 

    @Override 
    public void render(float delta) { 

     if(Gdx.input.isKeyJustPressed(Keys.ESCAPE)) pauseGame(); 

     if(gamestatus == GAME_CREATING) { 
      buttonContinue.addListener(new ClickListener(){ 
       public void clicked(InputEvent event, float x, float y) { 
        Gdx.gl.glClearColor(0,0,0,1); 
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
        gamestatus = GAME_RUNNING; 
       } 
      }); 
      buttonExit.addListener(new ClickListener(){ 
       public void clicked(InputEvent event, float x, float y) { 
        Gdx.app.exit(); 
       } 
      }); 

      table.add(title).padBottom(40).row(); 
      table.add(buttonContinue).size(150, 60).padBottom(20).row(); 
      table.add(buttonExit).size(150, 60).padBottom(20).row(); 
      table.setFillParent(true); 
      pauseStage.addActor(table); 
      Gdx.input.setInputProcessor(pauseStage); 
      Gdx.input.setInputProcessor(gameStage); 

      gamestatus = GAME_RUNNING; 
     } 

     if(gamestatus == GAME_RUNNING) { 
      Gdx.gl.glClearColor(0,0,0,1); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      gameStage.act(); 
      gameStage.draw(); 

      if(Gdx.input.justTouched())currentMonsterLife -= 1; 
      if(currentMonsterLife == 0)newMonster(); 
     } 


     if(gamestatus == GAME_PAUSED) { 
      Gdx.gl.glClearColor(0, 0, 0, 1); 
      Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
      pauseStage.act(); 
      pauseStage.draw(); 
     } 
    } 



    public void pauseGame() { 
     gamestatus = GAME_PAUSED; 

    } 

    @Override 
    public void resize(int width, int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void pause() { 
     pauseGame(); 

    } 

    @Override 
    public void resume() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void hide() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void dispose() { 
     for(int i = 0; i < monsterTextures.length; i++) { 
      monsterTextures[i].dispose(); 
     } 
     gameStage.dispose(); 
     pauseStage.dispose(); 
     menuSkin.dispose(); 
    } 

} 

А вот код в главном меню, где кнопки работают:

public class MainMenu implements Screen { 

    private Stage stage = new Stage(); 
    private Table table = new Table(); 
    private Skin menuSkin = Assets.menuSkin; 
    private TextButton buttonPlay = new TextButton("Play", menuSkin), 
         buttonExit = new TextButton("Exit", menuSkin); 
    private Label title = new Label ("Hunt for Power", menuSkin); 


    @Override 
    public void render(float delta) { 

     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     stage.act(); 
     stage.draw(); 

    } 

    @Override 
    public void show() { 

     buttonPlay.addListener(new ClickListener(){ 
      public void clicked(InputEvent event, float x, float y) { 
       ((Game)Gdx.app.getApplicationListener()).setScreen(new GameScreen()); 
      } 
     }); 
     buttonExit.addListener(new ClickListener(){ 
      public void clicked(InputEvent event, float x, float y) { 
       Gdx.app.exit(); 
      } 
     }); 

     table.add(title).padBottom(40).row(); 
     table.add(buttonPlay).size(150, 60).padBottom(20).row(); 
     table.add(buttonExit).size(150, 60).padBottom(20).row(); 
     table.setFillParent(true); 
     stage.addActor(table); 
     Gdx.input.setInputProcessor(stage); 

    } 

    @Override 
    public void resize(int width, int height) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void pause() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void resume() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void hide() { 
     dispose(); 
    } 

    @Override 
    public void dispose() { 
     stage.dispose(); 

    } 
} 

Я действительно надеюсь, что кто-то способен найти решение этого. Привет, Joshflux

ответ

2

Существует что-то странное с тем, как вы установите InputProcessor:

в шоу() метод, который вы установите этап stage как InputProcessor:

Gdx.input.setInputProcessor(stage); 

до сих пор так хорошо, но в методе render() вы устанавливаете его на разные этапы, чем тот, где находятся ваши кнопки!

Gdx.input.setInputProcessor(pauseStage); 
Gdx.input.setInputProcessor(gameStage); 

==> удалите этот код из метода визуализации! Также вы не должны иметь другой код, который выглядит так, как будто он должен выполняться только при создании экрана внутри метода render(). Кажется, что ваш код приводит к перекрывающимся этапам, кнопкам & таблиц, и неясно, какая ступень в данный момент установлена ​​как InputProcessor.

+0

Спасибо за подробный ответ, он работает сейчас :). – Joshflux

1

Как @donfuxx сказал, вы не должны устанавливать свой процессор ввода в render(), но в show().

И вы можете установить только один процессор ввода за раз. Второй звонок на setInputProcessor заменяет первый вызов. Если вам нужны два разных этапа в качестве входных процессоров, вы должны объединить их с InputMultiplexer:

public void show(){ 
    Gdx.input.setInputProcessor(new InputMultiplexer(pauseStage, gameStage)); //list them in order of precedence 
    //...your other code 
} 
+0

Спасибо, это сработало тоже :)! – Joshflux

Смежные вопросы