Кнопка Libgdx Hud Stage не прослушивает события

Я пытаюсь реализовать этап HUD поверх текущего этапа. Я могу визуализировать и рисовать сцену HUD, но события касания ее кнопок не реагируют.

Я вызываю свой drawHUD() из моего метода draw() GameScreen. Код для drawHUD()

public void drawHud(int scoreVal){
    Hud.this.getCamera().update();
    Hud.this.hudSpriteBatch.setProjectionMatrix(Hud.this.getCamera().combined);
    hudSpriteBatch.begin();
    scoreStr = "Score: " + scoreVal;
    glyphLayout.setText(scoreFont, scoreStr);
    halfWidth = glyphLayout.width/2;
    halfHeight = glyphLayout.height/2;
    scoreFont.draw(hudSpriteBatch, scoreStr, EatGame.CAMERA_WIDTH/2 - halfWidth, EatGame.CAMERA_HEIGHT - halfHeight);
    hudSpriteBatch.end();       
}

Я добавил слушателя к моему pauseBtn, как это при создании моего HUD

pauseBtn.addListener(new InputListener() {
        @Override
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            System.out.println("PauseBtn Touched");
            return false;
        }
}

Я также проверил, установив границы кнопки, но она не реагирует на события. Спасибо за чтение и помощь.


person Rakesh Yadav    schedule 07.01.2016    source источник
comment
touchDown должен возвращать логическое значение. Это вообще компилируется?   -  person TomGrill Games    schedule 07.01.2016
comment
Отредактировано сейчас, я пытался удалить некоторый код.   -  person Rakesh Yadav    schedule 07.01.2016


Ответы (2)


Обычно вы используете API scene2d для реализации кнопок и тому подобного. Класс Stage отвечает за обработку событий на правильном актере. Посмотрите на Stage#touchDown(), как они это делают. Если вы хотите реализовать это самостоятельно, вам нужно будет реализовать глобальный сенсорный прослушиватель и проверить, находятся ли координаты внутри границ кнопки, а затем вызвать fire на кнопке с правильным объектом Event.

Я настоятельно рекомендую использовать API scene2d, это намного проще, чем писать собственную систему обнаружения попаданий.

person morpheus05    schedule 07.01.2016
comment
Я использую ImageButton, который косвенно использует Актера в качестве своего родителя. Так что в основном я уже использую scene2d. Более того, я пытался использовать класс Актера, но безуспешно. Может быть, я что-то упускаю. - person Rakesh Yadav; 07.01.2016
comment
Вы должны использовать класс Stage, иначе он не будет работать. Возможно, это руководство окажется для вас более полезным: gamefromscratch.com/post/2013/11/27/ В своем приложении я попытался реализовать эту кнопку самостоятельно, но затем вернулся к scene2d, потому что это намного проще, я могу только порекомендовать потратить некоторое время с этой структурой. - person morpheus05; 07.01.2016
comment
Мой класс Hud расширяет класс Stage. - person Rakesh Yadav; 07.01.2016
comment
Почему ты рисуешь саму кнопку? Вы можете вызвать розыгрыш на сцене...? И не забывайте действовать. Вот так: stage.act(Gdx.graphics.getDeltaTime()); этап.рисовать(); - person morpheus05; 07.01.2016
comment
Спасибо morpheus05, Готово. Я пробовал Gdx.input.setInputProcessor(Hud.ths), но теперь сенсорные события не работают на моем GameScreen. Я могу установить InputProcessor либо на сцене HUD, либо на GameScreen (экран и сцена). Как я могу справиться с этим? - person Rakesh Yadav; 07.01.2016
comment
Я слышал о чем-то под названием InputMultiplexer, стоит ли мне его использовать? - person Rakesh Yadav; 07.01.2016

Мне пришлось использовать InputMultiplexer для получения входных событий с обоих этапов. Я сделал это таким образом.

    InputMultiplexer multiplexer = new InputMultiplexer();
    multiplexer.addProcessor(GameScreen.this);
    multiplexer.addProcessor(hud);
    Gdx.input.setInputProcessor(multiplexer);

Таким образом, он будет получать события с обоих этапов. GameScreen и Hud — это этапы.

person Rakesh Yadav    schedule 07.01.2016