libgdx 个按钮不可点击

libgdx buttons not clickable

我当前的 libGDX 项目有问题。 游戏从主菜单开始,您可以在其中单击两个按钮。开始游戏后,可以通过Esc暂停,进入暂停界面,和主菜单很像。 我不知道为什么,但暂停屏幕中的按钮不可点击。 这是有问题的游戏画面代码:

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();

    }
}

我真的希望有人能够找到解决这个问题的方法。 你好,乔什弗拉克斯

您设置 InputProcessor 的方式有点奇怪:

在 show() 方法中,您将 Stage stage 设置为 InputProcessor:

Gdx.input.setInputProcessor(stage);

到目前为止一切顺利,但在 render() 方法中,您将其设置为与按钮所在阶段不同的阶段!

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

==> 从 render 方法中删除这段代码!此外,您不应该拥有其他看起来只应在 render() 方法内创建屏幕时才执行的代码。您的代码似乎导致阶段、按钮和表格重叠,并且不清楚当前将哪个阶段设置为 InputProcessor。

就像@donfuxx 说的,你不应该在 render() 方法中设置你的输入处理器,而是在 show().

并且一次只能设置一个输入处理器。您对 setInputProcessor 的第二次调用将替换第一次调用。如果你想要两个不同的阶段作为输入处理器,你必须将它们与 InputMultiplexer 结合起来:

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