LIBGDX - 重叠的 actors 未检测到进入事件
LIBGDX - Overlapping actors not detecting enter event
我有这个代码片段位于一个组中:
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;
}
});
一些 actors 边界可能重叠,这似乎会导致 enter/exit 事件检测出现问题。只有重叠演员中最近的演员检测到事件可能是因为它的 Z 值更高。有没有一种方法可以触发所有演员的 enter/exit 事件,而不仅仅是最上面的那个?
probably because its Z value is higher
你的说法有点接近真实。 LibGDX event system 与两个阶段一起工作:捕获 和传播。
代码中的关键点是每个演员的侦听器方法 touchDown()
return 正确。这意味着将获得触地事件的第一个侦听器会处理它并中断 capture 阶段。
作为解决方案,您可以:
- 对
EventListener
中的事件做出反应但不中断 捕获 阶段(return false)
- add capture listener 并对捕获阶段的事件做出反应
这两种解决方案我都不是很喜欢,但我还没有找到更好的
您描述的行为是故意的。对于每个指针和在一帧中,enter 事件只能由指针下的一个 actor 触发。退出事件也一样。这就是 Stage
的设计方式,改变这种行为似乎并不容易。
顺便说一句,touchDown()
返回true或false与此无关。
我能想到一个可能的解决方法,有点乱,但这是总体思路:
1) 在 Stage
之前添加另一个 InputProcessor
,使用 InputMultiplexer
2) 使用该处理器,跟踪每个触摸指针的坐标。在触摸时注册一个指针,在触摸拖动 and/or 鼠标移动时更新它,在触摸向上时 - 取消注册。
3) 每一帧,检查每个 activeLineSegment 是否在任何触摸指针下。为此,您需要使用 Actor.screenToLocalCoordinates (Vector2)
将每个指针的屏幕坐标转换为 activeLineSegments 父级的本地坐标。
如果 activeLineSegment 不在前一帧的指针下,而它在当前帧中,那么您可以将这种情况视为进入事件。如果 activeLineSegment 之前在指针下,而在当前帧中不在(或指针被移除),那么它是一个退出事件。
我有这个代码片段位于一个组中:
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;
}
});
一些 actors 边界可能重叠,这似乎会导致 enter/exit 事件检测出现问题。只有重叠演员中最近的演员检测到事件可能是因为它的 Z 值更高。有没有一种方法可以触发所有演员的 enter/exit 事件,而不仅仅是最上面的那个?
probably because its Z value is higher
你的说法有点接近真实。 LibGDX event system 与两个阶段一起工作:捕获 和传播。
代码中的关键点是每个演员的侦听器方法 touchDown()
return 正确。这意味着将获得触地事件的第一个侦听器会处理它并中断 capture 阶段。
作为解决方案,您可以:
- 对
EventListener
中的事件做出反应但不中断 捕获 阶段(return false) - add capture listener 并对捕获阶段的事件做出反应
这两种解决方案我都不是很喜欢,但我还没有找到更好的
您描述的行为是故意的。对于每个指针和在一帧中,enter 事件只能由指针下的一个 actor 触发。退出事件也一样。这就是 Stage
的设计方式,改变这种行为似乎并不容易。
顺便说一句,touchDown()
返回true或false与此无关。
我能想到一个可能的解决方法,有点乱,但这是总体思路:
1) 在 Stage
之前添加另一个 InputProcessor
,使用 InputMultiplexer
2) 使用该处理器,跟踪每个触摸指针的坐标。在触摸时注册一个指针,在触摸拖动 and/or 鼠标移动时更新它,在触摸向上时 - 取消注册。
3) 每一帧,检查每个 activeLineSegment 是否在任何触摸指针下。为此,您需要使用 Actor.screenToLocalCoordinates (Vector2)
将每个指针的屏幕坐标转换为 activeLineSegments 父级的本地坐标。
如果 activeLineSegment 不在前一帧的指针下,而它在当前帧中,那么您可以将这种情况视为进入事件。如果 activeLineSegment 之前在指针下,而在当前帧中不在(或指针被移除),那么它是一个退出事件。