Почему моя LibGDX ImageButton обнаруживается только один раз? - PullRequest
0 голосов
/ 18 апреля 2019

Я делаю игру в Android Studio с использованием LibGDX и пытаюсь добавить кнопку паузы в верхний угол главного экрана игры.До сих пор моя игра была в паузе, но я делала паузу только при нажатии клавиши.Теперь я хочу добавить кнопку, и я получил кнопку для рендеринга в верхнем правом углу, но когда я нажимаю ее, она работает только один раз.Когда я нажимаю в первый раз, моя игра останавливается.Но каждый раз, когда я пытаюсь сделать паузу после этого, это не работает.Я использовал обширные операторы журнала и отладку и обнаружил, что после однократного нажатия на него слушатель даже не обнаруживает нажатие кнопки вообще, поэтому я уверен, что именно в этом моя проблема.

Вот как я создаю свою кнопку в своем классе 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 () работает отлично.Игра перед нажатием кнопки паузы выглядит следующим образом (Вы можете увидеть кнопку паузы в правом верхнем углу, извините за графику, они просто заполнители, пока я не создам и не добавлю свою графику): Игра до паузы

В моем основном классе 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 имеет значение true.Остальная часть моего рендеринга и другие необходимые обновления все еще происходят.Я пытался решить эту проблему в течение долгого времени, но независимо от того, сколько разных способов я переписываю код, чтобы приостановить игру или сделать разных слушателей, кнопка паузы работает только один раз, а затем никогда больше.

1 Ответ

0 голосов
/ 04 мая 2019

Вы когда-нибудь пробовали метод 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();
    }
    ...
}

Это упрощает ваш слушатель и позволяет вам легко найти вашу ошибку.

...