Удалить участников из сцены?
Я использую LibGDX и перемещаю только камеру в своей игре. Вчера я основал способ занять место в своей игре. Я пытаюсь сделать клон Flappy Bird, но у меня проблемы с рисованием земли, которая движется по экрану. В каждом вызове рендеринга я добавляю новый Actor
к Stage
, но через несколько раз рисунок больше не течет. Кадры в секунду погружаются очень быстро. Есть ли другой способ нарисовать землю в играх?
Ответы
Ответ 1
Если я правильно читаю, проблема заключается в том, что после того, как актеры уходят с экрана, они все еще обрабатываются и вызывают отставание, и вы хотите, чтобы их удаляли. Если это так, вы можете просто пропустить все актеры на сцене, проецировать их координаты в координаты окна и использовать их, чтобы определить, выключен ли актер.
for(Actor actor : stage.getActors())
{
Vector3 windowCoordinates = new Vector3(actor.getX(), actor.getY(), 0);
camera.project(windowCoordinates);
if(windowCoordinates.x + actor.getWidth() < 0)
actor.remove();
}
Если координаты актеров x в окне плюс его ширина меньше 0, актер полностью прокручивается с экрана и может быть удален.
Ответ 2
Небольшая настройка решения от @kabb:
for(Actor actor : stage.getActors()) {
//actor.remove();
actor.addAction(Actions.removeActor());
}
По моему опыту, вызов actor.remove()
при повторении stage.getActors()
приведет к разрыву цикла, поскольку он удаляет актера из массива, который активно повторяется.
Некоторые классы, подобные массиву, будут бросать ConcurrentModificationException
для такого рода ситуации в качестве предупреждения.
Итак... обходным путем является указание актерам удалять себя позже с помощью Action
actor.addAction(Actions.removeActor());
В качестве альтернативы... если вы по какой-то причине не можете дождаться, чтобы удалить актера, вы можете использовать SnapshotArray
:
SnapshotArray<Actor> actors = new SnapshotArray<Actor>(stage.getActors());
for(Actor actor : actors) {
actor.remove();
}
Ответ 3
Самый простой способ удалить актера из его родителя, вызвав его метод remove()
. Например:
//Create an actor and add it to the Stage:
Actor myActor = new Actor();
stage.addActor(myActor);
//Then remove the actor:
myActor.remove();