为什么我的LibGDX ImageButton仅被检测到一次?

时间:2019-04-18 16:05:01

标签: java android libgdx imagebutton

我正在使用LibGDX在Android Studio中制作游戏,并且试图在游戏主屏幕的顶部添加一个暂停按钮。到目前为止,我的游戏一直处于暂停状态,但是只有在按下某个键时才暂停。现在,我想添加一个按钮,并在右上角显示该按钮,但是当我按下它时,它只能工作一次。第一次按下它时,游戏会暂停。但是此后每次尝试暂停它时,它都不会起作用。我已经使用了大量的日志语句和调试程序,发现在按下一次之后,监听器甚至根本检测不到按下的按钮,因此我被认为是我的问题所在。

这是我在HUD类中创建按钮的方式,该类始终在屏幕上打印分数:

TextureAtlas buttonAtlas = new TextureAtlas(Gdx.files.internal("Buttons.pack"));
    Skin skin = new Skin();
    skin.addRegions(buttonAtlas);
    ImageButton.ImageButtonStyle style = new ImageButton.ImageButtonStyle();
    style.imageUp = skin.getDrawable("PauseButton");
    style.imageDown = skin.getDrawable("PauseButton");
    style.imageChecked = skin.getDrawable("PauseButton");
    button = new ImageButton(style);

然后我添加了一个侦听器,以检查是否单击了按钮:

button.addListener(new ClickListener()
    {
        @Override
        public void clicked(InputEvent event, float x, float y)
        {
            Gdx.app.log("","Button was pressed");

            pauseGame();
        }
    });

在侦听器检测到单击按钮之后调用的方法pauseGame():

public void pauseGame()
{
    Gdx.app.log("","Game should be pausing");

    screen.pauseGame();
}

screen是一个称为PlayScreen的类,它是我的游戏的主要游戏屏幕,并且其pauseGame()方法可完美运行。按下暂停按钮之前的游戏如下(您可以在右上角看到暂停按钮,请原谅这些图形,它们只是占位符,直到我制作并添加自己的图形为止): Game before pause

在我的主要PlayScreen类中,这是我的pauseGame方法:

public void pauseGame()
{
    gamePaused = true;

    if(music.isPlaying())
    {
        musicType = type.NORMAL;
        music.pause();
    }
    else if(barrageMusic.isPlaying())
    {
        musicType = type.BARRAGE;
        barrageMusic.pause();
    }

    createPauseWindow();
}

然后在我的render方法中,调用另一个称为update的方法。通过这种方法,我可以更新视口,HUD并创建新敌人。当gamePaused为true时,这是唯一停止调用的方法。我的其余渲染和其他必要的更新仍在进行。我一直在尝试解决此问题很长时间,但是无论我用多少种不同的方式重写代码来暂停游戏或创建不同的侦听器,暂停按钮都只能起作用一次,然后再也不能起作用。

1 个答案:

答案 0 :(得分:0)

您曾经尝试过使用touchDown方法吗? 可能有效。

button.addListener(new ClickListener(){
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                pause();
                event.handle();
                return true;
            }
        });

并尝试更改为全局变量库,即在渲染方法中检查的变量,如果为true,则调用pause方法。这样可以避免调用复杂的操作,例如从监听器中暂停,例如:

button.addListener(new ClickListener(){
            @Override
            public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) {
                pause = true;
                event.handle();
                return true;
            }
        });

...

public void render(){
    if (pause == true){
        pauseGame();
    }
    ...
}

它简化了您的侦听器,并让您轻松找到错误。