我如何知道 Scene2d 演员是否具有舞台坐标或本地到组

How do I know if Scene2d actor has Stage coordinates or local to Group

当我们在 Scene2d 中有一个 Actor 时,它似乎不知道它具有哪种坐标。 比如说,我们需要演员舞台坐标。所以,如果它是一个直接添加到 Stage 的 Actor,那么它将有一个 Stage 坐标,所以我们不应该转换它。但是当 actor 属于一个 Group 时,它将具有 Group-local 坐标,这些应该被转换。 有没有办法知道坐标是否应该转换?

对于直接添加到舞台的演员 actor.getParent() != actor.getStage(); 所以这种方法行不通。

有一款2D游戏。我在 SphereActor 上有一个 ClickListener,使用 touchDragged 方法,我在其中获取所有演员 'under'(根据 z-index)拖动的 SphereActor。因此,如果我们拖动 SphereActor 并将其悬停在磁铁上(在 z 轴上),它就会粘在磁铁上。所以伪代码看起来像这样:

 public void touchDragged(InputEvent event, float x, float y, int pointer) {

 Actor hit = getActorUnderThis();
 SphereActor thisActor = (SphereActor) event.getListenerActor();

 if (thisActor.canBeAttractedBy(hit)) {//true for magnets
     thisActor.setPosition(hit.getX(), hit.getY()); //stick to magnet
 }
}

除非我们的磁铁 所有 直接属于舞台,否则该方法有效。或者当 all 我们的磁铁在一个组内时,localToStage 转换将起作用。

但是磁铁有不同的种类,有的有动画,所以我把它们做成一个Group,有的没有,所以直接接在Stage上。所以为了让上面的代码工作,我必须用

让它变得超级丑陋
if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}

现在 Sphere 对磁铁的实现了解得太多了。如果有数百个不同的对象,其中一些在一个组中,而另一些则不呢?为每个添加一个 instanceof 检查看起来很糟糕。

所以我的问题主要是架构方面的问题,我应该在架构上做什么(以避免对球体中的磁铁了解太多),而不仅仅是 isBelongsToStageDirectly() 方法。

您可以检查 Actor 的父级是否等于舞台的根组。

创建舞台时,它会创建一个名为 root 的组实例来添加演员。查看 Stage.java 中的构造函数以查看它是否自动初始化 https://github.com/libgdx/libgdx/blob/master/gdx/src/com/badlogic/gdx/scenes/scene2d/Stage.java

所以你可以做类似的事情 if (hit.getParent() == stage.getRoot()) { // this is something added directly to the root of the stage }

如果您进入嵌套组 n 次,您可以使用 while 循环递归检查父组,直到到达阶段根。