Итак, у меня есть игра с прокруткой, где я использую box2d для физики. Моя камера фокусируется на проигрывателе, и только игрок движется. Игрок движется с помощью box2d, я установил линейную скорость, и все имеет трение 0. Препятствия кажутся заикающимися взад и вперед каждый раз в то время, а иногда, кажется, длится вечно или с самого начала заикается.Libgdx Box2d 60fps, но заикание
Способ воспроизведения спрайта игрока заключается в том, что у игрока есть метод обновления, который получает местоположение соответствующего тела box2d и сохраняет это местоположение для его использования в его методе визуализации. Я использую PPM, а все остальное - статическое тело.
У меня есть датчик, следующий за игроком, который обнаружит и блокирует выход из экрана и повторное использование этих блоков как больше препятствий, и я делаю подобные вещи для фона и пола, чтобы игрок мог бежать навсегда. Есть только 2 фона объекта 2 этаж объекта и 12 блоков объектов. Я убедился, что в моих методах рендеринга нет дорогостоящих операций, и я не создаю никаких новых объектов за пределами начальной загрузки состояния. Использование
Gdx.graphics.getFramesPerSecond()
Я определил, что кадр проходит между 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);
}
}
игрока делают и обновляют методы:
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.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 с обрезкой? –
Я использую TexturePacker, но я не знаю, что такое обрезка. – user1804234
в ТП у вас есть что-то вроде «Trim mode», вы установили его на что-то еще, что ** нет **? –