2016-11-05 8 views
1

私のゲームには問題があります。ゲームは、すべてのフレームで発生するオブジェクトの位置を変更する必要がある時間まで、正常に実行されます。たとえばここでは、駐車している車(道路の両側に約6台の車)の位置を変えなければなりません。車は絶えず画面内を移動しています。 Poolableを使用してリソースを節約しました。しかし、これらのコード行を実行する場合、ゲームは非常に不安定です。遅れを防ぐためにコードを改良する方法はありますか?たぶん新しいスレッドですか?そうであれば、新しいスレッドを作成してフレームごとに更新する正しい方法はどうでしょうか。Libgdx for loop lag

private void updateParkedVehicles(float delta){ 
    for (int i = 0; i < parkedCarLeft1Array.size; i++){ 
     parkedCarLeft1Array.get(i).update(delta); 

     for (int c = 0; c < parkedCarLeft1Array.size; c++){ 
      if (c != i){ 
       if (Intersector.overlaps(parkedCarLeft1Array.get(i).bounds, parkedCarLeft1Array.get(c).bounds)){ 
        parkedCarLeft1Array.get(i).reset(); 

       } 
      } 
     } 
    } 


    for (int i = 0; i < parkedCarRight1Array.size; i++){ 
     parkedCarRight1Array.get(i).update(delta); 

     for (int c = 0; c < parkedCarRight1Array.size; c++){ 
      if (c != i){ 
       if (Intersector.overlaps(parkedCarRight1Array.get(i).bounds, parkedCarRight1Array.get(c).bounds)){parkedCarRight1Array.get(i).reset(); 
       } 
      } 
     } 
    } 

} 

答えて

0

ゲームのアイテムを処理する1つの方法は、Scene2dを使用することです。 Scene2Dでは、アイテムを移動する必要がなくなります。代わりに、フレームを更新するたびにあなたのお手伝いをする必要はなく、移動する必要がある場合には、指導者に指示を与えます。一言で言えば

、あなたがこれを行うだろうアクションを追加するには:

if(SomeCondition){ 
    MoveToAction moveCar = new MoveToAction(); 
    moveCar.setPosition(anX,anY); 
    moveCar.setDuration(aDuration); 
    myCarActor.addAction(moveCar); 
} 

、あなたがチェックする必要がある唯一のものは、イベントの発生であり、あなたが車を移動するために、あなたの関数を呼び出す方法一度だけ(イベントが発生したとき)。

LibGdxはあなたのアクターごとにフレームを更新します。 ループ内で行う必要があるのは、衝突をチェックすることだけです。それらが発生した場合、あなたはあなたの俳優に新しいアクションを割り当てます。

Scene2Dを使用している場合は、カメラを使用することができます。これは、スクロールする必要がある場合は、各項目を移動する代わりに、単にカメラを移動するだけです(これにはズームなどが必要なすべての便利な方法があります)。 Scene2Dの詳細については

チェックアウト:特にアクションの詳細についてはhttps://github.com/libgdx/libgdx/wiki/scene2d

はこれをチェック: https://github.com/libgdx/libgdx/wiki/Scene2d#actions

はそれがお役に立てば幸いです。

+0

返信いただきありがとうございます。私はそれを試みます。私はちょうど更新が問題のほとんどを引き起こしているようではないことを指摘したいと思った。遅れは、主に衝突チェック部に起因すると思われる。それは避けられないように思われる。 –

0

問題は配列 - > O(n^2)の複雑さで二重にループしているようです。

「車が画面内で絶えず動いていて、再びリセットして上に戻してください」この車以外の各車との重複を確認する必要がある理由はわかりません。説明した動作のためにチェックすることです最も簡単な方法は、現在のy位置がそうであればあまりその0と静止位置である:

for (Car car : parkedCarLeft1Array){ 
     car.update(delta); 
     if (car.getY <= 0) { 
      car.reset(); 
     } 
    } 

私はあなたがupdate()方法で車の位置を更新することを前提としています。

+0

私は車がカメラに見える場所に行く前に車が互いに上に現れないことを確認する必要があります。車がそれぞれの上に表示される場合、カメラは到達できないグリッド内でランダムに高い位置を取る。もし車がそれ自体と重複しているかどうかを確認するなら、決して落ちないでしょう。それは絶えず再配置されます。私は車の位置を更新してupdate()に入り、車がカメラの下にも入っているかどうかを確認します。今のところ私がやったことは、ランダムな範囲をより高くすることですが、それは助けてくれますが、車は近くではありません。 –

+0

私はどんなゲームを開発しているのかは分かりませんが、とにかくこの二重ループ部分を再設計することを強くお勧めします。提案としては、いくつかの設定方法(配列を記入)で各車の初期位置を設定し、重なりがないかどうかチェックし、そうであればその車の位置を変更することができます。その後、リセットメソッドでは、ちょうど一定のY値を使用して位置をリセットします。この場合、UR車は互いに重なり合うことはありません。 – Enigo

+0

@JorgeMenjívar私の提案に何か不運? – Enigo