首页 文章

LibGDX运动不顺畅

提问于
浏览
4

我在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- =速度;因为速度是收到的参数

问题在于纹理有时会发出奇怪的声音,就好像设备无法处理游戏并冻结一瞬间 .

任何线索为什么会发生这种情况?

EDIT

发生的事情是纹理时不时地结果(我是西班牙语,我不知道那个词)

我认为它必须是与背景的每个部分的第二个图像相关的东西,即增加宽度 . 就像它增加了宽度一样,但有时因为fps的下降(如1或2 fps)太多而且下次因为fps恢复正常而“移动”回到好位置 .

EDIT 2 我在没有障碍的情况下尝试了它并且它仍然口吃,我再次尝试了障碍物而没有背景但它没有,所以它必须与我在第一次编辑中所说的一样 .

顺便说一下,FPS下降小于1(已选中)

我刚刚尝试绘制整个背景图像(没有视差),仍然是同样的问题 .

1 回答

  • 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* 是因为我'm assuming from your other code that you are actually drawing two copies of the background texture side by side. If you were drawing a single, wider texture that'宽于视口宽度常数,那么你将删除 2* .

    同样的问题当然适用于您的第二行代码,您可以在其中设置远背景位移 .

相关问题