私は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未満の場合、アクターは画面から完全にスクロールアウトされているため、削除できます。
@ 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();
}
_
remove()
メソッドを呼び出して親からアクターを削除する最も簡単な方法。例えば:
//Create an actor and add it to the Stage:
Actor myActor = new Actor();
stage.addActor(myActor);
//Then remove the actor:
myActor.remove();