LibGDX运动不顺畅

时间:2015-02-22 23:26:34

标签: java android libgdx game-physics parallax

我在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)的下降而过多,并且下一次&#34;移动&#34;回到好位置,因为fps恢复正常。

编辑2 我尝试了它没有障碍,它仍然口吃,我再次尝试与障碍物,没有背景,它没有,所以它必须与我在第一次编辑中说的话。

BTW,FPS下降小于1(已检查)

我刚刚尝试绘制整个背景图像(没有视差),但问题仍然存在。

1 个答案:

答案 0 :(得分:2)

我看到一个与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*

同样的问题当然也适用于你的第二行代码,你设置远背景位移。