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