我怎么知道Scene2d actor是否具有舞台坐标或局部于组

时间:2019-02-05 09:52:07

标签: java libgdx scene2d

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

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

有一个2D游戏。我在SphereActor上有一个ClickListener,它具有touchDragged方法,在这里,我将所有actor“拖到下方”(以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
 }
}

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

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

使其变得非常丑陋
if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}

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

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

1 个答案:

答案 0 :(得分:1)

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

创建舞台时,它将创建一个名为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循环递归检查父级,直到到达阶段根。