LibGdx多点触控 - 处理听众

时间:2017-03-12 16:04:39

标签: java android libgdx multi-touch

我遇到了一些涉及多次触摸的问题。

有一个Stage(mainStage),上面有一个Actor(playLight,代码如下),一个HUD Stage(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无法找到另一个ID的输入

我试过了:

  1. 将对象放在另一个舞台上(在本例中为HUD舞台)
  2. 不要求mainStage侦听器中的ID,这会导致在向上移动对象时模拟触发两个侦听器(如预期的那样)。

1 个答案:

答案 0 :(得分:0)

演员在Stage添加时会有默认的侦听器。您应该做的是使用方法DragListener而不是mainStage使用pan中的监听器。以下是您在mainStage

中移动Actor的方法
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时,它会定位在您手指的中心。