LIBGDX - 重叠的演员没有检测到输入事件

时间:2017-11-29 01:51:21

标签: events libgdx actor scene2d

我将此代码段放在一个组中:

addActor(getActiveLineSegment());

    getActiveLineSegment().addListener(new InputListener(){
        @Override
        public void enter(InputEvent event, float x, float y, int pointer, Actor fromActor){
            System.out.println("Enter");
        }

        @Override
        public void exit(InputEvent event, float x, float y, int pointer, Actor toActor){
            System.out.println("Exit");
        }

        @Override
        public boolean touchDown (InputEvent event, float x, float y, int pointer, int button) {
            return true;
        }
    });

某些演员界限可能会重叠,这似乎会导致进入/退出事件检测出现问题。只有重叠演员的最近演员可能会因为其Z值更高而检测到该事件。有没有办法可以在所有演员身上发出进入/退出事件而不仅仅是顶部的那个?

2 个答案:

答案 0 :(得分:0)

  

可能是因为它的Z值更高

你的陈述很接近真实。 LibGDX event system适用于两个阶段:捕获传播

代码中的关键点是每个actor的侦听器方法touchDown()都返回true。这意味着将获得触地事件的第一个听众处理它并打破捕获阶段 作为解决方案,您可以:

  1. EventListener中的事件做出反应,但不会中断捕获阶段(返回false)
  2. add capture listener并对捕获阶段的事件做出反应
  3. 两种解决方案对我都不太满意,但我找不到更好的

答案 1 :(得分:0)

您描述的行为是故意的。对于每个指针和一个帧,enter事件只能由指针下的一个actor触发。退出事件也是如此。这就是Stage的设计方式,而且似乎并不是一件容易改变这种行为的事情。 顺便说一句,touchDown()返回true或false与此无关。

我可以想到一个可能的解决方法,它有点混乱,但这是一般的想法:

1)使用InputProcessor

Stage之前添加另一个InputMultiplexer

2)使用该处理器,跟踪每个触摸指针的坐标。在触摸时注册一个指针,在touchDrag和/或mouseMove上更新它,在touchUp上 - 取消注册它。

3)每个帧,检查每个activeLineSegment是否在任何触摸指针下。为此,您需要使用Actor.screenToLocalCoordinates (Vector2)将每个指针的屏幕坐标转换为activeLineSegments父级的本地坐标。 如果activeLineSegment不在前一帧中的指针下,并且它在当前帧中,那么您可以将此情况视为enter事件。如果activeLineSegment先前在指针下,并且当前帧中没有(或指针被删除),那么它就是退出事件。