Scene2d touchDown не срабатывает на Актере

Я создал простой тест с событием touchDown() для актера изображения. Событие работает на сцене, но не на актере. Вот код:

Я установил InputProcessor в конструкторе родительского класса (AbstractScreen).

Gdx.input.setInputProcessor(this.stage);

В подклассе:

private TextureAtlas atlas;
private Image boardImg;

public void show(){
    super.show(); 

    atlas = new TextureAtlas(Gdx.files.internal("data/packs/mainMenu.atlas"));      
    AtlasRegion board = atlas.findRegion("board");

    boardImg = new Image(board);

    boardImg.addListener(new InputListener(){
           public boolean touchDown(InputEvent event, float x, float y, int pointer, int    button){
               Gdx.app.log("aaaa", "down");
               return true;
           }
    });

    stage.addActor(boardImg);

    stage.addListener(new InputListener() {
          public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
               Gdx.app.log("aaaa", "stage down");
               return true;
          }
    });     
}


@Override
public void resize(int width, int height) {
    super.resize(width, height);        
    boardImg.setPosition(stage.getWidth()/2 - boardImg.getWidth()/2, stage.getHeight()/4);  
}

Тестирую и на десктопе и на андроиде (результаты одинаковые). Я получаю событие «сцена вниз», но не событие актера. Я пробовал и без сценического события.


person Drorasta    schedule 09.11.2012    source источник
comment
Я не могу найти какой-либо четкий документ об этом, но работает ли он, если слушатель вашей сцены возвращает false вместо true? (Мне непонятно, что на самом деле делает возвращаемое значение...)   -  person P.T.    schedule 09.11.2012
comment
Проблема возникла из-за того, что я добавил еще одно прозрачное изображение поверх изображения доски, чтобы оно закрывало сенсорную область изображения доски. Я по ошибке убрал это изображение из вопроса, потому что хотел сделать код короче, извините, ребята. У меня есть ответ на форуме badlogic libgdx, предлагающий скрыть верхние прозрачные изображения от касания. topmage.setTouchable(Touchable.disabled);   -  person Drorasta    schedule 16.11.2012


Ответы (3)


Выполните все эти работы:

  1. boardImg.setTouchable(Touchable.enabled)

  2. вернуть false в прослушиватель этапа или очистить его прослушиватель.

  3. не вызывайте setInputProcessor(this.stage) в родительском классе, вместо этого вызывайте в дочернем классе.

person Aliaaa    schedule 09.11.2012

Я думаю, проблема в том, что метод touchDown() сцены возвращает true, поэтому событие будет "потреблено" и не будет передано его дочерним элементам, акторам , поэтому метод touchDown() для boardImg вызываться не будет.

person flawyte    schedule 10.11.2012

Изображение не получает события касания, поскольку оно не имеет размера.

Внимательно прочитайте документацию:

Обратите внимание, что актор должен указать свои границы, чтобы получать входные события в этих границах.

Просто знайте, что boardImg = new Image(board) не будет устанавливать ширину и высоту актера за вас. Поэтому вам нужно сделать это вручную. Предположим, вы работаете с идеальными размерами пикселей:

boardImg = new Image(board);
boardImg.setWidth(board.getWidth());
boardImg.setHeight(board.getHeight());

Это поможет. Удачи.

person Metaphore    schedule 12.08.2014