gpt4 book ai didi

java - 我如何知道 Scene2d actor 是否具有舞台坐标或组的本地坐标

转载 作者:行者123 更新时间:2023-12-02 10:18:14 25 4
gpt4 key购买 nike

当我们在 Scene2d 中有一个 Actor 时,它似乎不知道它有哪种坐标。比如说,我们需要 Actor 舞台坐标。因此,如果它是直接添加到舞台的 Actor,那么它将有一个舞台坐标,因此我们不应该转换它。但是,当 Actor 属于一个组时,它将具有组本地坐标,并且应该对这些坐标进行转换。有没有办法知道坐标是否应该转换?

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

有一个 2D 游戏。我在 SphereActor 上有一个 ClickListener,使用 touchDragged 方法,在该方法中我将所有 actor 置于拖动的 SphereActor 的“下方”(以 z 索引表示)。因此,如果我们拖动 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 转换将起作用。

但是磁铁有不同类型,其中一些有动画,所以我将它们作为一个组,而有些则没有,所以它们直接连接到舞台。所以为了让上面的代码工作,我必须用

让它变得 super 难看
if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}

现在 Sphere 对磁铁的实现了解得太多了。如果有数百个不同的对象,其中一些在一组,另一些则不在,该怎么办?为每个添加一个instanceof检查看起来很糟糕。

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

最佳答案

您可以检查 Actor 的父级是否等于舞台的根组。

创建舞台时,它会创建一个名为 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()) {
//这是直接添加到舞台根部的东西
}

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

关于java - 我如何知道 Scene2d actor 是否具有舞台坐标或组的本地坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54531647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com