2014-11-09 2 views
2

Я занимаюсь разработкой 2D-видеоигры с использованием libgdx. Я столкнулся с проблемой, когда пытаюсь сделать прыжок с тела. Он не прыгает так, как ожидалось, после того, как он движется вправо (я могу двигаться только вправо или прыгать)Как сохранить ту же высоту прыжка в libgdx

Если тело прыгает до того, как оно движется вправо, все идет хорошо. Но если я решит совершить прыжок по телу после перемещения его вправо. Тело больше не перескакивает на одну и ту же высоту (оно скачет меньше). И я не понять, почему ..

Мой метод прыгать тело:

if (player.isPlayerOnGround()) { 
     body.applyForceToCenter(0, 200, true); 
    } 

Мой метод для перемещения вправо

if (player.isPlayerOnGround()) { 
     body.setLinearDamping(0f); 
     body.setLinearVelocity(1f,0f); 
     isMoving = true; 
    } 

Мой метод тело, чтобы остановить перемещение тела вправо :

body.setLinearDamping(5f); 
    isMoving = false; 

мир использовать -9.81f тяжести и 1f тела для мессы

.

P.S: Извините за плохой английский, это не мой родной язык.

спасибо.

ответ

2

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

public void jump() { 
     if (jumpDelta >= Constants.PLAYER_JUMP_RATE) { 
      grounded = level.getContactListener().numFootContacts > 0; 
      if (grounded) { 
       body.setLinearVelocity(body.getLinearVelocity().x, 7); 
       jumpDelta = 0; 
      } 
     } 
    } 

Где if (jumpDelta >= Constants.PLAYER_JUMP_RATE) предотвращает от слишком быстрых прыжков (как два или более прыжки один раза), grounded = level.getContactListener().numFootContacts > 0; проверяет, является ли игрок находится на платформе и, наконец, это body.setLinearVelocity(body.getLinearVelocity().x, 7); изменяет вертикальную скорость тела. Изменение скорости работает лучше, чем прикладывание импульса, потому что импульс не устанавливает скорость, он увеличивает скорость. Поэтому, если игрок движется вниз с вертикальной скоростью -3 м/с, тогда его скорость станет 4, а не 7, как мы хотели.

P.S. Вместо линейного демпфирования я использую этот метод

public void stopMoving() { 
     if (grounded) { 
      if (Math.abs(body.getLinearVelocity().x) <= 0.5f) 
       body.setLinearVelocity(0, body.getLinearVelocity().y); 
      else 
       body.applyLinearImpulse(-direction * 0.5f, 0, 
         body.getPosition().x, body.getPosition().y, true); 
     } else if (Math.abs(body.getLinearVelocity().x) <= 0.1f) 
      body.setLinearVelocity(0, body.getLinearVelocity().y); 
     else 
      body.applyLinearImpulse(-direction * 0.1f, 0, body.getPosition().x, 
        body.getPosition().y, true); 
    } 

Этот метод может показаться слишком сложным, но это очень просто. Первая часть обрабатывает движение тела на земле и второе в воздухе. if-statements предотвращают изменение направления тела при остановке, а переменная direction может быть 1, если движение тела вправо, -1, если движение тела влево и 0, если тело не движется.

+0

Благодарим вас за ответ. Я понимаю, что вы мне сказали, и это прекрасно работает. Но не могли бы вы рассказать мне, как вы узнали libgdx? по своему усмотрению, или вы читали балет? Спасибо –

+0

Очень хорошая книга «Изучение развития игры Libgdx» https://www.packtpub.com/game-development/learning-libgdx-game-development Я загрузил эту книгу с торрента (пиратство, arrrgghh). А потом у меня возникли вопросы. В конце книги есть некоторая информация о box2d для создания морковного дождя. И я узнал, что box2d читает отличное официальное руководство (весь код находится на C++, но вы его не заметите) и много поисковых систем. – nikoliazekter

+0

Пиратство aKa обмен: p Спасибо, очень плохо прочитал –

Смежные вопросы