关于java:我怎么知道Scene2d actor是否具有舞台坐标或局部于Group

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

当我们在Scene2d中有一个Actor时,似乎不知道它具有哪种坐标。
说,我们需要演员舞台协调员。因此,如果它是直接添加到舞台上的Actor,则它将具有舞台坐标,因此我们不应该对其进行转换。但是,当actor属于一个Group时,它将具有Group-local坐标,并且应该将其转换。
有没有办法知道是否应该转换座标?

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

有一个2D游戏。我在SphereActor上有一个ClickListener,它具有touchDragged方法,在这里我将所有参与者"在\\下"(以z-index表示)拖动了SphereActor。因此,如果我们拖动SphereActor并将其悬停在磁体上(在z轴上),它就会粘在磁体上。因此伪代码如下所示:

1
2
3
4
5
6
7
8
9
 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
 }
}

该方法有效,除非我们所有的磁铁都直接属于Stage。或者,当我们所有的磁体都在一个组中时,使用localToStage转换将起作用。

但是有不同类型的磁铁,其中一些具有动画效果,所以我将它们作为一个组进行创建,而其中一些则没有,因此它们直接连接到Stage。因此,要使上述代码起作用,我必须使

变得非常丑陋

1
2
3
if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}

现在Sphere对磁铁的实现了解得太多了。而且如果有成百上千个不同的对象怎么办,而其中有些却没有呢?为每个检查添加一个instanceof看起来很糟糕。

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


您可以检查演员的父母是否等于舞台的根组。

创建舞台时,它将创建一个名为root的Group实例,以向其添加actor。请参阅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
}

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