android LibGDX移动不平稳

muk1a3rh  于 2023-03-06  发布在  Android
关注(0)|答案(2)|浏览(117)

我正在LibGDX中制作一个游戏。我有4个纹理作为视差背景和一些障碍物(一个在屏幕的上半部分,其他在屏幕的下半部分),这是运动部分:

//Parallax    
if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2) bckgndmiddle_x=-(game_speed*delta)/2; else bckgndmiddle_x-=(game_speed*delta)/2;
    if (bckgndfar_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/5)      bckgndfar_x=-(game_speed*delta)/5; else bckgndfar_x-=(game_speed*delta)/5;

    for (Obstacle obst:obstacles) {
        obst.update(game_speed*delta);
    }

    //End Main game loop

    player.update();
    game.batch.begin();
    game.batch.draw(wall, bckgndfar_x,floor.getRegionHeight()+100);
    game.batch.draw(wall, bckgndfar_x+wall.getRegionWidth(),floor.getRegionHeight()+100);
    game.batch.draw(bot_furniture, bckgndmiddle_x,floor.getRegionHeight());
    game.batch.draw(bot_furniture, bckgndmiddle_x+bot_furniture.getRegionWidth(),floor.getRegionHeight());
    game.batch.draw(floor, bckgndmiddle_x,0);
    game.batch.draw(floor, bckgndmiddle_x+floor.getRegionWidth(),0);
    game.batch.draw(ceiling, bckgndfar_x,Const.VIEWPORT_H-ceiling.getRegionHeight());
    game.batch.draw(ceiling, bckgndfar_x+ceiling.getRegionWidth(),Const.VIEWPORT_H-ceiling.getRegionHeight());

障碍物更新方法就是x-=速度;因为速度是接收到的参数
问题是,不时的纹理摆动奇怪,就像如果设备不能处理游戏,冻结了一瞬间。
知道为什么会这样吗?

编辑

所发生的是,纹理口吃不时(我是西班牙人,我不知道这个词)
我认为这一定是与背景的每一部分的第二个图像有关的东西,即宽度的增加。就像它增加了宽度,但有时它太多了,因为下降了fps(像1或2 fps),下一次它"移动"回好的位置,因为fps恢复正常。

***EDIT 2***我在没有障碍的情况下尝试了它,它仍然口吃,我在没有背景的情况下再次尝试了它,它没有,所以它一定是我在第一次编辑中所说的东西。

顺便说一句,FPS下降小于1(已检查)
我刚刚试着画了一个完整的背景图像(没有视差),仍然是同样的问题。

2hh7jdfx

2hh7jdfx1#

我看到了一个可能的原因,与FPS下降无关:
下面是第一行,为了清晰起见,将其分开:

if (bckgndmiddle_x <= -Const.VIEWPORT_W*2+(game_speed*delta)/2) 
    bckgndmiddle_x = -(game_speed*delta)/2; 
else 
    bckgndmiddle_x -= (game_speed*delta)/2;

通常,else语句用于以恒定速度移动背景。但是每当它到达if语句时,位置是显式设置的,而不考虑它的前一个位置,因此移动不会平滑。您需要将它移动到一个看起来从它的前一个位置移动了-(game_speed*delta)/2的位置。
一种方法是始终快速移动对象,并且仅在必要时将其向前移动纹理的宽度作为校正。例如,假设您将屏幕左下角保持在(0,0)::

float midWidth = floor.getRegionWidth();

bckgndmiddle_x -= game_speed*delta/2; //Always move it at constant speed.
if (bckgndmiddle_x + 2*midWidth < Const.VIEWPORT_W) //Right edge starting to show. 
    bckgndmiddle_x += midWidth; // Shift it exactly by its width so the jump is undetectable

上面的2*是因为我从你的其他代码中假设你实际上是在并排绘制背景纹理的两个副本。如果你是在绘制一个比视口宽度常量更宽的单个更宽的纹理,那么你应该删除2*
当然,这个问题也适用于第二行代码,在那里设置远背景位移。

0lvr5msh

0lvr5msh2#

存在类似问题,已通过禁用垂直同步修复

LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
    config.vSyncEnabled = false;

相关问题