LibGdx Multiple Touch - обработка слушателей

У меня есть некоторые проблемы, связанные с несколькими касаниями.

Существует этап (mainStage) с актером (playLight, код ниже), этап HUD (HUD.stage) и InputMultiplexer для обработки обоих этапов.

inputMultiplexer= new InputMultiplexer();
    inputMultiplexer.addProcessor(HUD.stage);
    inputMultiplexer.addProcessor(mainStage);

Я хочу обрабатывать ввод двумя пальцами, чтобы один палец мог двигать мой объект, а другой - проводить пальцем вверх и вниз или дважды касаться любого места на моей сцене, за исключением того места, где находится мой актер.

Я использую Слушатель для моей основной сцены:...

mainStage.addListener(new ActorGestureListener(5,0.3f,0.4f,2f){
        @Override
        public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) {
            if(event.getPointer() == LightHandler.playerLight.pointerUsed){
                listeningToPointer = -1;
                return;
            }

            listeningToPointer= event.getPointer();
            if(deltaY>0){
                mainCharacter.up();
            }
            else{
                mainCharacter.down();
            }
        }


        @Override
        public void tap(InputEvent event, float x, float y, int count, int button) {

            if(count==2){
                mainCharacter.clicked();
                }
        }
    });

..и для объекта на этом этапе (mainStage)

playerLight.addListener(new DragListener(){
        @Override
        public void drag(InputEvent event, float x, float y, int pointer) {
            pointerUsed = pointer;  // will be reset to -1 at the end of update()
            setPosition(getX()+ Gdx.input.getX(pointerUsed)-getWidth()/2f,getY()+Gdx.input.getY(pointerUsed)-getHeight()/2f);
        }

        @Override
        public void dragStart(InputEvent event, float x, float y, int pointer) {
            pointerUsed = pointer;  // will be reset to -1 at the end of update() 
            isDragging = true;
        }

        @Override
        public void dragStop(InputEvent event, float x, float y, int pointer) {
            isDragging = false;
        }
    });
mainStage.addActor(playerLight);

Оба слушателя работают по отдельности так, как я хочу.

Проблема заключается в том, что когда я перемещаю объект на сцене (playerLight) одним пальцем и пытаюсь выполнить панорамирование другим пальцем, GDX, похоже, не распознает второй вход или, по крайней мере, GDX не может найти вход с другим идентификатором.

Я старался:

  1. Поместить объект на другую стадию (в данном случае стадия HUD)
  2. Не запрашивать идентификатор в слушателе mainStage, что приводит к тому, что оба слушателя симулируют при перемещении моего объекта вверх (как и ожидалось).

1 ответ

У актеров будет прослушиватель по умолчанию, когда он будет добавлен Stage, Что вы должны сделать, это вместо того, чтобы использовать DragListener использовать слушатель в вашем mainStage с методом pan, Вот как вы перемещаете своего Актера внутри своего mainStage

public void pan(InputEvent event, float x, float y, float deltaX, float deltaY) 
 {
    // get a specific actor on the stage
   if (event.getTarget().equals(actor)) 
    {
     float dx = x - actor.getWidth() / 2;
     float dy = y - actor.getHeight() / 2;
      actor.setPosition(dx,dy);
     return;
    }

 }

Это так просто. Мы вычитаем actor.getWidth() / 2; а также actor.getHeight() / 2; так что когда ваш палец коснется Actor он будет располагаться в центре вашего пальца.

Другие вопросы по тегам