Java 把演员从舞台上撤走?

Java 把演员从舞台上撤走?,java,libgdx,draw,game-engine,flappy-bird-clone,Java,Libgdx,Draw,Game Engine,Flappy Bird Clone,我使用LibGDX,在游戏中只移动相机。昨天我找到了一种在比赛中获胜的方法。我正试图复制一只Flappy Bird,但我在绘制屏幕上移动的地面时遇到了问题。在每次渲染调用中,我都会向阶段添加一个新的参与者,但几次之后,图形不再流动。每秒帧数下降得非常快。在游戏中还有其他的方法可以让游戏更具吸引力吗?如果我读的没错,你的问题是,一旦演员离开屏幕,他们仍在被处理,造成延迟,你希望他们被移除。如果是这样的话,您可以简单地循环舞台上的所有演员,将他们的坐标投影到窗口坐标,并使用这些坐标确定演员是否在屏幕

我使用LibGDX,在游戏中只移动相机。昨天我找到了一种在比赛中获胜的方法。我正试图复制一只Flappy Bird,但我在绘制屏幕上移动的地面时遇到了问题。在每次渲染调用中,我都会向
阶段添加一个新的
参与者
,但几次之后,图形不再流动。每秒帧数下降得非常快。在游戏中还有其他的方法可以让游戏更具吸引力吗?

如果我读的没错,你的问题是,一旦演员离开屏幕,他们仍在被处理,造成延迟,你希望他们被移除。如果是这样的话,您可以简单地循环舞台上的所有演员,将他们的坐标投影到窗口坐标,并使用这些坐标确定演员是否在屏幕外

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();
}
for(Actor:stage.getActors())
{
Vector3窗口坐标=新的Vector3(actor.getX(),actor.getY(),0);
摄像机投影(视窗坐标);
if(windowCoordinates.x+actor.getWidth()<0)
actor.remove();
}

如果窗口中的actor x坐标加上其宽度小于0,则actor已完全从屏幕上滚动,可以删除。

从其父级删除actor的最简单方法是调用其
remove()
方法。例如:

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

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

@kabb的解决方案稍作调整:

    for(Actor actor : stage.getActors()) {
        //actor.remove();
        actor.addAction(Actions.removeActor());
    }
根据我的经验,在迭代
stage.getActors()
时调用
actor.remove()
,将打破循环,因为它将从正在进行主动迭代的数组中删除actor

某些类似数组的类将抛出
ConcurrentModificationException
对于这种情况作为警告

所以…解决方法是告诉演员们以后用
动作

    actor.addAction(Actions.removeActor());

或者……如果出于某种原因您迫不及待地要删除该演员,您可以使用
SnapshotArray

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

您只是想在演员不可见时删除他们?这不会造成太大的性能损失,而且删除演员所获得的性能远远超过了对演员的补偿。可能需要演员在act()方法中自行完成。更容易,因为每个演员可能都有特定的“理由”将自己从游戏中移除。