web-dev-qa-db-ja.com

ステージから俳優を削除しますか?

私はLibGDXを使用し、ゲーム内でカメラのみを移動します。昨日、私は自分のゲームで地面を描く方法を見つけました。 Flappy Birdのクローンを作成しようとしていますが、画面上で動いている地面を描くのに問題があります。レンダリングを呼び出すたびに、新しいActorStageに追加しますが、数回実行すると、描画が流れなくなります。 1秒あたりのフレーム数は非常に速くシンクします。ゲームで地面を描く別の方法はありますか?

15
Fabian König

私が正しく読んでいる場合、問題は、アクターが画面から消えても、まだ処理中であり、ラグが発生しているため、アクターを削除する必要があるということです。その場合は、ステージ内のすべてのアクターをループし、それらの座標をウィンドウ座標に投影し、それらを使用してアクターが画面外にあるかどうかを判断できます。

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未満の場合、アクターは画面から完全にスクロールアウトされているため、削除できます。

19
kabb

@ 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();
    }
_
14
bitstrider

remove()メソッドを呼び出して親からアクターを削除する最も簡単な方法。例えば:

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

//Then remove the actor:
myActor.remove();
5
Tony Ceralva