【问题标题】:Why is my LibGDX ImageButton only being detected once?为什么我的 LibGDX ImageButton 只被检测到一次?
【发布时间】:2019-04-18 16:05:01
【问题描述】:

我正在使用 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();
        }
    });

Listener检测到按钮被点击后调用的方法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();
}

然后在我的渲染方法中,我调用了另一个名为 update 的方法。在这种方法中,我更新了我的视口、我的 HUD,并创建了新的敌人。这是唯一在 gamePaused 为真时停止调用的方法。我的其余渲染和其他必要的更新仍在进行。我一直在尝试解决这个问题,但无论我重写代码以暂停游戏或制作不同的听众有多少不同的方式,暂停按钮只能工作一次,然后再也不会。

【问题讨论】:

  • 在游戏暂停时您是否停止执行游戏逻辑?
  • 显示屏幕的 pauseGame 方法
  • @QBrute,我不会停止我所有的游戏逻辑,无论如何,当游戏恢复时,任何逻辑都会重新启动。当我第二次尝试暂停游戏时,它不起作用。

标签: java android libgdx imagebutton


【解决方案1】:

你试过touchDown 方法吗? 它可能有效。

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

并尝试更改为全局变量 base,这是在您的渲染方法中检查的变量,如果为真,则调用 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();
    }
    ...
}

它简化了您的侦听器,让您轻松发现错误。

【讨论】:

  • 我已经尝试过了,并在考虑您的建议后再次尝试,但仍然没有成功。游戏将暂停一次,再也不会。
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多