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循环递归检查父级,直到到达阶段根。