我将此代码段放在一个组中:
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值更高而检测到该事件。有没有办法可以在所有演员身上发出进入/退出事件而不仅仅是顶部的那个?
答案 0 :(得分:0)
可能是因为它的Z值更高
你的陈述很接近真实。 LibGDX event system适用于两个阶段:捕获和传播。
代码中的关键点是每个actor的侦听器方法touchDown()
都返回true。这意味着将获得触地事件的第一个听众处理它并打破捕获阶段
作为解决方案,您可以:
EventListener
中的事件做出反应,但不会中断捕获阶段(返回false)两种解决方案对我都不太满意,但我找不到更好的
答案 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先前在指针下,并且当前帧中没有(或指针被删除),那么它就是退出事件。