我的游戏有问题。游戏运行正常,直到我必须重新定位对象的时间,这发生在每一帧。例如,我必须重新定位一些停放的汽车(道路两侧约6辆汽车),汽车在屏幕上不断向下移动,然后它们重置并重新定位在顶部。我使用Poolable来节省资源。但是,在运行这些代码行时,游戏仍然非常激动。有什么办法可以改进代码来防止滞后吗?也许是新线程?如果是这样,那么创建新线程并在每一帧更新它的正确方法将是什么。
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 :(得分:0)
处理游戏中物品的一种方法是使用Scene2d。 Scene2D允许您离开必须移动自己的项目。相反,如果你需要移动它们而不必处理每一帧更新,你可以给它们指示(作为导演)。
简而言之,要添加一个Action,你会这样做:
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
希望它有所帮助。
答案 1 :(得分:0)
在我看来,问题在于通过数组进行双循环 - &gt; O(n ^ 2)复杂度!!
我不清楚为什么你需要检查每辆车与每辆车的重叠,除了这辆车,如果“汽车在屏幕上不断向下移动,然后他们重置并重新定位在顶部”。对于所描述的行为,最简单的方法是检查当前y位置是否小于0,如果是,则检查休息位置:
for (Car car : parkedCarLeft1Array){
car.update(delta);
if (car.getY <= 0) {
car.reset();
}
}
我假设你用update()
方法更新了汽车位置。