Java Libgdx-Box2d 60fps但口吃
好的,我有一个侧滚游戏,我用box2d来做物理。我的相机聚焦在球员身上,只有球员在移动。玩家使用box2d移动,我设置了线速度,所有物体的摩擦力为0。这些障碍似乎每隔一段时间就会断断续续地来回走动,有时似乎会一直持续下去,或者从一开始就是断断续续的 播放器精灵的渲染方式是,播放器有一个更新方法,该方法获取相应box2d主体的位置,并存储该位置,以便在其渲染方法中使用。我确实使用PPM,其他一切都是静态体 我在播放器后面有一个传感器,它会检测和阻止屏幕外的障碍物,并将这些障碍物重新用作更多障碍物。我在背景和地板上做类似的事情,这样播放器就可以永远奔跑。只有2个背景对象2个楼层对象和12个块对象。我确保在渲染方法中没有代价高昂的操作,并且在状态的初始加载之外不会创建任何新对象。 使用 我已经确定fps在60到61之间,所以我不认为这是一个滞后问题,我不知道如何解决这个问题 主要渲染方法:Java Libgdx-Box2d 60fps但口吃,java,android,libgdx,box2d,Java,Android,Libgdx,Box2d,好的,我有一个侧滚游戏,我用box2d来做物理。我的相机聚焦在球员身上,只有球员在移动。玩家使用box2d移动,我设置了线速度,所有物体的摩擦力为0。这些障碍似乎每隔一段时间就会断断续续地来回走动,有时似乎会一直持续下去,或者从一开始就是断断续续的 播放器精灵的渲染方式是,播放器有一个更新方法,该方法获取相应box2d主体的位置,并存储该位置,以便在其渲染方法中使用。我确实使用PPM,其他一切都是静态体 我在播放器后面有一个传感器,它会检测和阻止屏幕外的障碍物,并将这些障碍物重新用作更多障碍物。
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(),查看x或y是否以正确的方式更改
如果是物理问题,解决方法是将夹具材料恢复设置为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