Как лучше всего делать анимацию персонажей с помощью Box2D?

Я разрабатываю 2D-подводную ролевую игру для Android, используя Box2D в качестве физического движка, в основном для обнаружения столкновений, реагирования на столкновения и движения игровых персонажей в среде, состоящей из стен, камней и других существ.

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

Пример анимации, которую я пытаюсь сделать, выглядит следующим образом:

Рыба хочет атаковать другую рыбу, поэтому делает следующее:
1) Двигайтесь к цели со скоростью
2) Откусите целевое существо
3) Повернитесь и бегите обратно туда, где началась атака.
4) Повернитесь лицом к цели, готовясь к новой атаке.

Я пробовал два подхода:

A) Примените силу к атакующему (с помощью body.applyForce ()), чтобы переместить его к цели, затем еще одну силу, чтобы вернуть его обратно после столкновения < br> Проблемы:
* Часто атакующий попадает в цель, отскакивает и на огромной скорости улетает назад и отскакивает от стен повсюду. Скорость довольно случайна, в зависимости от того, где она поражает цель, массы цели и т. Д. Она нарушает анимацию и выглядит ужасно.
* Очень сложно понять, какие силы следует применить к атакующему и когда , чтобы смоделировать конкретную анимацию в физическом мире, чтобы она выглядела реалистично.

B) Непосредственно установите позицию нападающего (с помощью body.setTransform ()), чтобы переместить нападающего в правильную позицию, когда он продвигается вперед на каждом шаге, а затем возвращается назад. снова.
Проблемы:
* Прямая установка позиции позволяет атакующему игнорировать столкновения со стенами и другими существами, поэтому застревание в стене является обычным явлением
* Если игрок нападая, я обновляю мировое происхождение по мере движения игрока, чтобы он оставался посередине экрана. Это работает хорошо, за исключением случаев, когда я запускаю анимацию, поскольку я не хочу, чтобы экран следовал за анимацией, а только компонент движения существующей скорости, о которой я не знаю, поскольку я переопределяю силы Box2D / скорости, когда я устанавливаю позицию. Я уверен, что это возможно, но сложно - может, я упускаю что-то очевидное.

Следует ли мне следить за столкновениями? Отмена реакции на столкновение ?? Что-то другое?

Итак, как вы порекомендуете мне подойти к этой проблеме?


person Steve Moseley    schedule 08.04.2011    source источник


Ответы (1)


Я привык работать только с Farseer, но Farseer - это довольно прямой порт с Box2D, поэтому я надеюсь, что этот ответ все еще полезен.

Помимо применения силы и телепортации, вы также можете установить линейную скорость движения тела. Таким образом, вы можете заставить рыбу двигаться к игроку без применения силы. Вы должны захватить события столкновения из тела рыбы и сравнить в каждом случае, если рыба попала в игрока, а затем установить false / NoCollision в событии столкновения с игроком, чтобы оно не отскакивало. Теперь настройте тело рыбы так, чтобы оно игнорировало любые столкновения с телом игрока, и используйте фиксированный сустав, чтобы прикрепить рыбу к игроку. Теперь вы можете воспроизвести анимацию укуса.

После анимации поклевки вы хотите отключить рыбу. Запустите анимацию бегства, удалите сустав и телепортируйте рыбу к краю тела игрока (чтобы она не сталкивалась с ним). После этого снова включите столкновения между рыбой и телом игрока и отправьте рыбу подальше от игрока (либо снова установив скорость линейного движения, либо для хорошего эффекта отскока с помощью силы.

person Roy T.    schedule 08.04.2011
comment
Привет, Рой, в твоем предложении используется подход, о котором я не думал, и похоже, что он может быть победителем. Я проведу несколько быстрых тестов и дам вам знать, что я нашел. Спасибо !! - person Steve Moseley; 09.04.2011
comment
Спасибо, Рой! Конечно, нужно было потрудиться, чтобы каждый этап работал должным образом (с множеством забавных побочных эффектов), но теперь он работает хорошо. Большое спасибо !! - person Steve Moseley; 14.04.2011