2016-11-05 94 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

處理遊戲中物品的一種方法是使用Scene2d。 Scene2D允許您不必移動項目。相反,如果需要移動它們,而不是必須處理每個幀更新12次,則需要向他們提供指示(如導演)。

簡而言之

,添加一個動作你可以這樣做:

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值重置位置。在這種情況下,我們的汽車永遠不會相互重疊。 – Enigo

+0

@JorgeMenjívar對我的建議有什麼好運氣? – Enigo