Libgdx / Box2D Применить нажатие к телу?

#java #libgdx #box2d #game-physics

#java #libgdx #box2d #игра-физика

Вопрос:

В настоящее время я разрабатываю небольшой сканер подземелий. Мой класс «Рыцарь» должен обладать особой способностью. Он должен быть в состоянии продвигаться вперед и прорываться сквозь врагов. В настоящее время я использую тела Box2D для врагов и игрока… Есть идеи, как дать телу игрока толчок в направлении?

Я уже тестировал :

 entityBody.applyLinearImpulse(100f, 0, entityBody.getWorldCenter().x,    entityBody.getWorldCenter().y, true);          
  

Это работает, но проблема в том, что тело телепортируется в этом направлении, а не «продвигается вперед». Он также не сталкивается при таком быстром движении… Есть идеи?

Комментарии:

1. Вы пробовали это с body.setLinearVelocity() ? Для меня это работает идеально.

2. Привет! Спасибо за ваш быстрый ответ 🙂 Я только что попробовал, но есть одна проблема, из-за playermovement я установил параметры тела равными нулю (без этого тело будет скользить). Когда я пытаюсь установить linearVelocity, он перемещается в этом направлении, но игнорирует тела объектов… Странно то, что это происходит только тогда, когда я использую высокую линейную скорость

3. Нет идей? :/ Я был бы рад некоторой помощи

Ответ №1:

Посмотрите, что говорит вики: https://github.com/libgdx/libgdx/wiki/box2d#impulsesforces

Возможно, вас заинтересует раздел примера перемещения игрока. Они применяют левый или правый импульс к телу в зависимости от того, нажата ли и какая клавиша, и если тело не достигло максимальной скорости.

 Vector2 vel = this.player.body.getLinearVelocity();
Vector2 pos = this.player.body.getPosition();

// apply left impulse, but only if max velocity is not reached yet
if (Gdx.input.isKeyPressed(Keys.A) amp;amp; vel.x > -MAX_VELOCITY) {          
     this.player.body.applyLinearImpulse(-0.80f, 0, pos.x, pos.y, true);
}

// apply right impulse, but only if max velocity is not reached yet
if (Gdx.input.isKeyPressed(Keys.D) amp;amp; vel.x < MAX_VELOCITY) {
     this.player.body.applyLinearImpulse(0.80f, 0, pos.x, pos.y, true);
}
  

Для проблемы, связанной с тем, что столкновение не происходит из-за слишком быстрого перемещения тела, вам может потребоваться установить флаг маркера в BodyDef тела:

     bodyDef.bullet = true;
  

Вы также устанавливаете импульс x на 100, что в основном означает, что скорость x установлена на 100 метров в секунду … чертовски быстро (около 224 миль в час). Если это необходимо, тогда не стесняйтесь колотить врагов со скоростью суперкара!