我在组中有此代码片段:
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 阶段。
作为解决方案,您可以:
- 对
EventListener
中的事件做出反应,但不断裂 capture phase(返回false) - 添加捕获听众并对捕获阶段的事件做出反应
这两种解决方案都不喜欢我,但是我还没有找到更好的