Как узнать, имеет ли актер Scene2d координаты сцены или локально для группы - PullRequest
0 голосов
/ 05 февраля 2019

Когда у нас есть актер в Scene2d, кажется, что он не знает, какие у него координаты.Скажем, нам нужны координаты сцены актеров.Так что, если это актер, добавленный непосредственно в сцену, то он будет иметь координаты сцены, поэтому мы не должны его конвертировать.Но когда субъект принадлежит группе, он будет иметь локальные координаты группы, и их следует преобразовать.Есть ли способ узнать, следует ли преобразовывать координаты?

Для актеров, добавленных непосредственно на сцену actor.getParent ()! = Actor.getStage ();Так что такой подход не сработает.

Есть 2D игра.У меня есть ClickListener в SphereActor с методом touchDragged, где я получаю всех актеров «под» (с точки зрения 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
 }
}

Этот подход работает, если все наши магниты не принадлежат непосредственно к сцене.Или с localToStage преобразование будет работать, когда все наши магниты находятся внутри группы.

Но существуют разные типы магнитов, некоторые из них имеют анимацию, поэтому я сделал их как группу, инекоторые из них нет, поэтому они напрямую связаны со сценой.Таким образом, чтобы приведенный выше код работал, я должен сделать его безобразным с

if (hit instanceOf AnimatedMagnet) {
// convert coords to stage before use
}

Теперь Сфера слишком много знает о реализации магнита.А что, если есть сотни различных объектов, некоторые из них в группе, а некоторые нет?Добавление экземпляра проверки для каждого выглядит ужасно.

Так что мой вопрос в основном по архитектуре, что я должен был делать архитектурно (чтобы избежать слишком большого знания магнитов в сфере), а не просто isBelongsToStageDirectly () метод.

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете проверить, равен ли родитель актера корневой группе этапа.

Когда создается сцена, она создает экземпляр группы с именем root для добавления актеров.См. Конструктор в Stage.java, чтобы увидеть, что он инициализируется автоматическипроверяйте родителей с помощью цикла while, пока не дойдете до корня сцены.

...