Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Libgdx-Box2d 60fps但口吃_Java_Android_Libgdx_Box2d - Fatal编程技术网

Java Libgdx-Box2d 60fps但口吃

Java Libgdx-Box2d 60fps但口吃,java,android,libgdx,box2d,Java,Android,Libgdx,Box2d,好的,我有一个侧滚游戏,我用box2d来做物理。我的相机聚焦在球员身上,只有球员在移动。玩家使用box2d移动,我设置了线速度,所有物体的摩擦力为0。这些障碍似乎每隔一段时间就会断断续续地来回走动,有时似乎会一直持续下去,或者从一开始就是断断续续的 播放器精灵的渲染方式是,播放器有一个更新方法,该方法获取相应box2d主体的位置,并存储该位置,以便在其渲染方法中使用。我确实使用PPM,其他一切都是静态体 我在播放器后面有一个传感器,它会检测和阻止屏幕外的障碍物,并将这些障碍物重新用作更多障碍物。

好的,我有一个侧滚游戏,我用box2d来做物理。我的相机聚焦在球员身上,只有球员在移动。玩家使用box2d移动,我设置了线速度,所有物体的摩擦力为0。这些障碍似乎每隔一段时间就会断断续续地来回走动,有时似乎会一直持续下去,或者从一开始就是断断续续的

播放器精灵的渲染方式是,播放器有一个更新方法,该方法获取相应box2d主体的位置,并存储该位置,以便在其渲染方法中使用。我确实使用PPM,其他一切都是静态体

我在播放器后面有一个传感器,它会检测和阻止屏幕外的障碍物,并将这些障碍物重新用作更多障碍物。我在背景和地板上做类似的事情,这样播放器就可以永远奔跑。只有2个背景对象2个楼层对象和12个块对象。我确保在渲染方法中没有代价高昂的操作,并且在状态的初始加载之外不会创建任何新对象。 使用

我已经确定fps在60到61之间,所以我不认为这是一个滞后问题,我不知道如何解决这个问题

主要渲染方法:

 public void render(){
    //clear screen
    Gdx.gl20.glClear(GL20.GL_COLOR_BUFFER_BIT);

    //set camera to follow player
    cam.position.set(player.getPosition().x * B2DVars.PPM + NinjaJumper.V_WIDTH / 4,
            NinjaJumper.V_HEIGHT/2, 0);
    cam.update();

    sb.setProjectionMatrix(cam.combined);
    //render the background
    for (int i = 0; i < backgrounds.length; i++){
        backgrounds[i].render(sb);
    }

    //render the player
    player.render(sb);

    if(haveBlocks) {
        for (int i = 0; i < blocks.length; i++) {
            blocks[i].render(sb);
        }
    }

    //render the ground
    for (int i = 0; i < ground.length; i++){
        ground[i].render(sb);
    }

    sb.setProjectionMatrix(hudCam.combined);
    hud.render(sb);

    if(debug) {
        //set camera to follow player
        b2dCam.position.set(player.getPosition().x + (NinjaJumper.V_WIDTH / 4) / B2DVars.PPM,
                (NinjaJumper.V_HEIGHT / 2) / B2DVars.PPM, 0);
        b2dCam.update();
        b2dr.render(world, b2dCam.combined);
    }
}
有人能告诉我我做错了什么吗?我花了好几天的时间来研究这个问题,但我还是不明白

编辑pack.pack:

pack.png
format: RGBA8888
filter: Linear,Linear
repeat: none
mainpage
  rotate: false
  xy: 1, 281
  size: 960, 720
  orig: 960, 720
  offset: 0, 0
  index: -1
ground
  rotate: false
  xy: 1, 140
  size: 600, 139
  orig: 600, 139
  offset: 0, 0
  index: -1
treeM
  rotate: false
  xy: 603, 38
  size: 139, 241
  orig: 139, 241
  offset: 0, 0
  index: -1
tree
  rotate: false
  xy: 744, 39
  size: 137, 240
  orig: 137, 240
  offset: 0, 0
  index: -1
treeS1
  rotate: false
  xy: 883, 42
  size: 133, 237
  orig: 133, 237
  offset: 0, 0
  index: -1
treeS
  rotate: false
  xy: 1, 19
  size: 67, 119
  orig: 67, 119
  offset: 0, 0
  index: -1
button1
  rotate: false
  xy: 70, 114
  size: 70, 24
  orig: 70, 24
  offset: 0, 0
  index: -1
button2
  rotate: false
  xy: 70, 88
  size: 70, 24
  orig: 70, 24
  offset: 0, 0
  index: -1
platform
  rotate: false
  xy: 963, 969
  size: 32, 32
  orig: 32, 32
  offset: 0, 0
  index: -1
block
  rotate: false
  xy: 1, 1
  size: 16, 16
  orig: 16, 16
  offset: 0, 0
  index: -1

pack2.png
format: RGBA8888
filter: Linear,Linear
repeat: none
treeM1
  rotate: false
  xy: 1, 625
  size: 255, 378
  orig: 255, 378
  offset: 0, 0
  index: -1
treeH
  rotate: false
  xy: 258, 540
  size: 200, 463
  orig: 200, 463
  offset: 0, 0
  index: -1
ninja1
  rotate: false
  xy: 460, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja2
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja3
  rotate: false
  xy: 503, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1

pack3.png
format: RGBA8888
filter: Linear,Linear
repeat: none
ninja4
  rotate: false
  xy: 1, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja5
  rotate: false
  xy: 503, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja6
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja7
  rotate: false
  xy: 503, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1

pack4.png
format: RGBA8888
filter: Linear,Linear
repeat: none
mainpage1
  rotate: false
  xy: 1, 1
  size: 900, 600
  orig: 900, 600
  offset: 0, 0
  index: -1

pack5.png
format: RGBA8888
filter: Linear,Linear
repeat: none
ninja8
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1

有两个可能成为口吃来源的领域——渲染和物理

当您在TexturePacker中使用修剪时,您需要在绘制过程中处理偏移,但这不是您的情况-请注意,您有所有偏移零大小原始完全相同

你应该专注于你的物理。box2D中有一个众所周知的错误,当两个物体——小的和大的——接触时会出现,导致口吃。请尝试以下两种方法:

  • 用来看看你的身体是口吃还是只是个小精灵
  • 尝试在每个步骤中注销body.getPosition(),查看xy是否以正确的方式更改

如果是物理问题,解决方法是将夹具材料恢复设置为0,并尝试设置线性阻尼以避免一些小动作

您是否使用带修剪的TexturePacker?我使用TexturePacker,但我不知道修剪是什么。在TP中,您有类似“修剪模式”的功能你把它设成别的什么了吗?我没有看到任何显示修剪模式的东西。除了min filter和mag filter之外,我的所有设置都是默认设置,但在我更改这些设置之前,我遇到了这个问题。好的,然后请与我共享你的.atlas/.pack文件好的,我认为问题在于物理原因,因为身体会结巴,但我设置了多少以及何时设置线性阻尼?是在创建时更新还是在所有更新中更新以及更新多少?从修改材料恢复开始。如果它不能帮助你测试你需要多少倾倒,从1开始,比如说,你需要做一次,当创建Body时,我将所有恢复设置为1,阻尼设置为1-0.025,但是口吃仍然存在,即使阻尼使我的家伙爬行变慢,我仍然可以看到口吃恢复应该设置为零-阻尼尽可能小,因为它会“停止”你的角色对不起,我的意思是恢复设置为零,我一直测试到0.00001f的阻尼,它仍然口吃。我是否应该继续尝试更小的数字?
public void update(float dt){
    animation.update(dt);
    sprite.setRegion(animation.getFrame());
    sprite.setCenter(body.getPosition().x * B2DVars.PPM,
            body.getPosition().y * B2DVars.PPM  - 5);
}

public void render(SpriteBatch sb){
    sb.begin();
    sprite.draw(sb);
    sb.end();
}
pack.png
format: RGBA8888
filter: Linear,Linear
repeat: none
mainpage
  rotate: false
  xy: 1, 281
  size: 960, 720
  orig: 960, 720
  offset: 0, 0
  index: -1
ground
  rotate: false
  xy: 1, 140
  size: 600, 139
  orig: 600, 139
  offset: 0, 0
  index: -1
treeM
  rotate: false
  xy: 603, 38
  size: 139, 241
  orig: 139, 241
  offset: 0, 0
  index: -1
tree
  rotate: false
  xy: 744, 39
  size: 137, 240
  orig: 137, 240
  offset: 0, 0
  index: -1
treeS1
  rotate: false
  xy: 883, 42
  size: 133, 237
  orig: 133, 237
  offset: 0, 0
  index: -1
treeS
  rotate: false
  xy: 1, 19
  size: 67, 119
  orig: 67, 119
  offset: 0, 0
  index: -1
button1
  rotate: false
  xy: 70, 114
  size: 70, 24
  orig: 70, 24
  offset: 0, 0
  index: -1
button2
  rotate: false
  xy: 70, 88
  size: 70, 24
  orig: 70, 24
  offset: 0, 0
  index: -1
platform
  rotate: false
  xy: 963, 969
  size: 32, 32
  orig: 32, 32
  offset: 0, 0
  index: -1
block
  rotate: false
  xy: 1, 1
  size: 16, 16
  orig: 16, 16
  offset: 0, 0
  index: -1

pack2.png
format: RGBA8888
filter: Linear,Linear
repeat: none
treeM1
  rotate: false
  xy: 1, 625
  size: 255, 378
  orig: 255, 378
  offset: 0, 0
  index: -1
treeH
  rotate: false
  xy: 258, 540
  size: 200, 463
  orig: 200, 463
  offset: 0, 0
  index: -1
ninja1
  rotate: false
  xy: 460, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja2
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja3
  rotate: false
  xy: 503, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1

pack3.png
format: RGBA8888
filter: Linear,Linear
repeat: none
ninja4
  rotate: false
  xy: 1, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja5
  rotate: false
  xy: 503, 503
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja6
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1
ninja7
  rotate: false
  xy: 503, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1

pack4.png
format: RGBA8888
filter: Linear,Linear
repeat: none
mainpage1
  rotate: false
  xy: 1, 1
  size: 900, 600
  orig: 900, 600
  offset: 0, 0
  index: -1

pack5.png
format: RGBA8888
filter: Linear,Linear
repeat: none
ninja8
  rotate: false
  xy: 1, 1
  size: 500, 500
  orig: 500, 500
  offset: 0, 0
  index: -1