Какой лучший способ сделать анимацию персонажей с Box2D? - PullRequest
3 голосов
/ 08 апреля 2011

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

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

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

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

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

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

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

Должен ли я следить за столкновениями?Переопределение реакции на столкновение ??Что-то еще?

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

1 Ответ

0 голосов
/ 08 апреля 2011

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

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

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

...