libgdx按钮不可点击

时间:2015-07-16 12:35:59

标签: button libgdx scene2d

我当前的libGDX项目有问题。 游戏以主菜单开始,您可以在其中单击两个按钮。启动游戏后,您可以通过Esc暂停它并进入暂停屏幕,这与主菜单非常相似。 我不知道为什么,但暂停屏幕中的按钮不可点击。 以下是带有问题的游戏屏幕代码:

set LOC_WIN32=c:\Customer\xxxxxx
set LOC_UNIX=c:/Customer/xxxxxxx
echo Starting Designer...
start %LOC_WIN32%\bin\xxxxxxx.exe %LOC_UNIX%/Designer/lib/xxxxxxxx.tcl -guiFile %1

以下是主菜单的代码,其中按钮正在工作:

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

}

我真的希望有人能够找到解决方案。 问候,Joshflux

2 个答案:

答案 0 :(得分:2)

设置InputProcessor的方式有些奇怪:

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

Gdx.input.setInputProcessor(stage);

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

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

==&GT;从render方法中删除此代码!此外,您不应该让其他代码看起来只应在render()方法中创建屏幕时执行。看起来您的代码会导致重叠的阶段,按钮和放大器。表格并且不清楚当前哪个阶段被设置为InputProcessor。

答案 1 :(得分: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
}
相关问题