2015-09-05 4 views
0

Итак, у меня есть игра с прокруткой, где я использую 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 
+0

Вы используете TexturePacker с обрезкой? –

+0

Я использую TexturePacker, но я не знаю, что такое обрезка. – user1804234

+0

в ТП у вас есть что-то вроде «Trim mode», вы установили его на что-то еще, что ** нет **? –

ответ

0

Есть два возможных областей можно быть источником заикания - рендеринга и физики.

При использовании подрезки в TexturePacker вам нужно обработать смещение во время рисования, но это не ваш случай - пожалуйста, обратите внимание, вы все сдвигает нули и размер точно так же, как ориг ,

Вы должны сосредоточиться на своей физике. Существует хорошо известная ошибка в box2D, когда два тела - маленькие и большие - находятся в контакте и вызывают заикание. Пожалуйста, попробуйте эти две вещи:

  • использовать Box2D debug renderer, чтобы увидеть, если ваши тела заикание или просто спрайт
  • пытаются выйти тело.GetPosition() на каждом шагу, чтобы увидеть, если х или у меняется в правильном пути

Если проблема с физикой решение установить приспособление материала реституцию и попытаться setLinearDamping, чтобы избежать небольших ходов

+0

Хорошо, я думаю, что проблема связана с физикой, потому что тела заикаются, но сколько и когда я устанавливаюLinearDamping? Это при создании или во всех обновлениях и на сколько? – user1804234

+0

начать с изменения материала реституции. Если это не поможет проверить, сколько демпинга вам нужно, начиная с let say 1 - вам нужно сделать это один раз при создании тела. –

+0

У меня есть все реституция, установленная на одну, и увлажнение, которое я пытался от 1 до 0,025, но заикание все еще там, даже когда увлажнение замедляет моего парня до ползания, я все еще вижу, что заикание – user1804234