当我们在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()方法。
答案 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循环递归检查父级,直到到达阶段根。