2014-03-01 92 views
14

我使用LibGDX並只移動相機在我的遊戲中。昨天我創立了一種在我的比賽中取得勝利的方式。我試圖製作一個Flappy Bird的克隆,但是我在繪製在屏幕上移動的地面時遇到了問題。在每次渲染調用中,我會在Stage中添加一個新的Actor,但幾次之後,繪圖就不再流淌了。每秒幀數非常快。遊戲中還有另外一種方法來吸引觀衆嗎?從舞臺上移除演員?

+0

只需要在演員不可見時刪除演員? –

回答

17

如果我正確地閱讀,你的問題是,一旦演員離開屏幕,他們仍然在處理,造成滯後,你想他們被刪除。如果是這樣,您可以簡單地遍歷舞臺中的所有演員,將其座標投影到窗口座標,並使用這些座標確定演員是否在屏幕外。

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,演員已經完全滾動離開屏幕,並且可以被移除。

+0

它不應該在性能上造成太大的損失,並且從刪除角色所獲得的性能可以彌補它的不足。 – kabb

+1

可能讓actor在act()方法中自己完成它。因爲每個演員都可能具有特定的「推理」以實際將自己從遊戲中移除,因此更容易。 – RichieHH

5

從其父母中刪除一名演員的最簡單方法是調用其方法remove()。例如:

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

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

的解決方案從輕微的調整@kabb

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

從我的經驗,呼籲actor.remove()而迭代stage.getActors()將打破循環,因爲它從正在積極迭代的數組中移除actor。

對於這種情況,一些類似數組的類會拋出ConcurrentModificationException 作爲警告。

所以......解決辦法是告訴演員們用自己的Action

actor.addAction(Actions.removeActor()); 

或者刪除 ...如果你不能等待刪除演員出於某種原因,您可以使用SnapshotArray

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