17

我使用 LibGDX 并且只在我的游戏中移动相机。昨天我找到了一种在我的游戏中画出地面的方法。我正在尝试制作 Flappy Bird 的克隆,但在绘制屏幕上移动的地面时遇到问题。在每次渲染调用中,我都会向 . 添加一个新ActorStage,但几次之后,绘图不再流动。每秒帧数下降得非常快。还有其他方法可以在游戏中吸引人吗?

4

3 回答 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();
}

如果actor在窗口中的x坐标加上它的宽度小于0,则actor已经完全滚出屏幕,可以被移除。

于 2014-03-02T17:04:05.820 回答
19

对@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();
    }
于 2015-08-16T19:10:27.137 回答
5

从调用它的方法的父级中移除一个actor的最简单remove()方法。例如:

//Create an actor and add it to the Stage:
Actor myActor = new Actor();
stage.addActor(myActor);

//Then remove the actor:
myActor.remove();
于 2015-01-06T21:16:01.703 回答