#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 миль в час). Если это необходимо, тогда не стесняйтесь колотить врагов со скоростью суперкара!