当我们在Scene2d的演员似乎不知道哪种坐标它。再说了,我们需要演员舞台COORDS。所以,如果它是一个演员直接添加到舞台那么它将有一个舞台的坐标,所以我们should't转换。但是,当演员属于一个集团,将拥有集团本地COORDS这些应转换。有没有办法知道是否COORDS应该转换或不?
对于演员直接加入到阶段actor.getParent()= actor.getStage()!;这样的做法是行不通的。
有一个2D游戏。我有一个SphereActor ClickListener,与touchDragged方法,在这里我得到的所有的演员“下”(在Z指数而言)的拖累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
}
}
这种方法只除非我们所有的磁体属于直接的阶段。或localToStage当我们所有的磁铁是一个集团内部的皈依会工作。
但也有不同类型的磁体,其中一些有动画,所以我做了他们作为一个集团,其中有些都没有,所以他们直接连接到舞台上。所以有上面的代码工作,我必须使它超级丑陋
if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}
现在球知道太多关于磁铁实现。如果有一百个不同的对象是什么有些人的组中,有些则不是?添加一个instanceof检查每一个看起来很可怕。
所以我的问题主要是结构的角度来看,我应该做的架构(以避免球磁铁太多的知识),而不仅仅是isBelongsToStageDirectly()方法。
您可以检查以查看是否有演员的母公司等于舞台的根集团。
当创建一个阶段将创建一个名为根演员添加到组实例。见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循环检查的父母,直到你到舞台根。