libgdx-重叠的参与者未检测到Enter事件



我在组中有此代码片段:

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;
        }
    });

一些参与者的界限可能重叠,这似乎与Enter/退出事件检测有关。重叠演员的最新演员只能检测到该事件,这可能是因为其Z值更高。有什么办法可以在所有演员上发射Enter/退出事件,而不仅仅是顶部的演员?

您描述的行为是有意的。对于每个指针和一个帧,Enter事件只能由指针下的一位演员发射。出口事件相同。这就是Stage的底线,并且似乎对改变这种行为并不琐碎。顺便说一句, touchDown()返回对还是错与此无关。

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

1)使用InputMultiplexer

在您的Stage之前添加另一个InputProcessor

2)使用该处理器,为每个接触指针跟踪坐标。触摸时,您会在触摸drag和/或mousemove上注册指针,然后在touchup上进行更新 - 取消注册。

3)每个帧,如果每个触摸指针都在任何触摸的指针下,请检查每个Activilinesement。为此,您需要使用Actor.screenToLocalCoordinates (Vector2)将每个指针的屏幕坐标转换为Activelinegments父母的本地坐标。如果Activelinesement在上一个帧中不在指针下,并且在当前帧中,那么您可以将这种情况视为Enter Enter事件。而且,如果ActivelIneSement先前在指针下方,并且在当前帧中不是(或删除指针),则是一个退出事件。

可能是因为其z值更高

您的陈述很近。libgdx事件系统与两个阶段一起工作: capture 繁殖

代码中的关键点是每个演员的侦听器方法touchDown()返回true。这个意思是第一个听众,他将获得调整事件的处理并破坏 capture 阶段。
作为解决方案,您可以:

  1. EventListener中的事件做出反应,但不断裂 capture phase(返回false)
  2. 添加捕获听众并对捕获阶段的事件做出反应

这两种解决方案都不喜欢我,但是我还没有找到更好的

最新更新