Удалить участников из сцены?

Я использую 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();