从舞台中删除演员?

17

我使用LibGDX,并且只移动相机来实现游戏中的画面。昨天,我找到了一种在游戏中绘制地面的方法。我正在尝试制作Flappy Bird的克隆版本,但是我在绘制地面时遇到了问题,因为这个地面需要在屏幕上移动。在每次渲染调用中,我向Stage添加一个新的Actor,但是几次之后,绘制效果不再流畅,每秒帧数急剧下降。是否有另一种在游戏中绘制地面的方法?


你想在演员不可见时将他们移除吗? - Orhan Obut
3个回答

21

如果我理解正确,您的问题是演员离开屏幕后仍在运行导致卡顿,您想要将它们删除。如果是这种情况,您只需循环遍历舞台上的所有演员,将它们的坐标投影到窗口坐标上,并使用这些坐标来确定演员是否离开屏幕。

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,则演员已完全滚动出屏幕,可以将其移除。


它不应该导致太多性能损失,而通过移除演员获得的性能收益远远超过了这点损失。 - kabb
1
可能让演员在act()方法中自行完成。这样做会更容易,因为每个演员可能都有特定的“推理”来实际从游戏中移除自己。 - RichieHH

20

稍作修改,参考@kabb的解决方案:

    for(Actor actor : stage.getActors()) {
        //actor.remove();
        actor.addAction(Actions.removeActor());
    }

根据我的经验,在迭代stage.getActors()时调用actor.remove()打破循环,因为它从正在被迭代的数组中删除了该actor。

一些类似数组的类会抛出ConcurrentModificationException作为警告.

所以...解决方法是通过Action告诉演员稍后自行删除。

    actor.addAction(Actions.removeActor());

或者...如果你因为某些原因无法等待删除该演员,你可以使用SnapshotArray

    SnapshotArray<Actor> actors = new SnapshotArray<Actor>(stage.getActors());
    for(Actor actor : actors) {
        actor.remove();
    }

5
最简单的从父级中移除一个演员的方法是调用其remove()方法。例如:
//Create an actor and add it to the Stage:
Actor myActor = new Actor();
stage.addActor(myActor);

//Then remove the actor:
myActor.remove();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接