Когда у нас есть актер в 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 () метод.