Выполнение собственных вычислений физики для столкновения в наборе Sprite - программирование
Подтвердить что ты не робот

Выполнение собственных вычислений физики для столкновения в наборе Sprite

Я пытаюсь настроить некоторые упругие столкновения с помощью Sprite Kit. Существует проблема с случаем, когда несколько объектов находятся рядом друг с другом, как я спросил в Проблема столкновения с физикой Sprite Kit

Я запутался в сроках ситуации для столкновения.

Я попытался установить dynamic в NO в -didBeginContact: метод делегата, вычислить конечные скорости, затем в -didEndContact: установить dynamic в YES, а затем правильно установить скорости.

Причина, по которой я хочу, чтобы она была динамической вне столкновения, заключается в том, что я хочу, чтобы трение/гравитация и т.д. были доступны. Что не так с порядком/логикой? Я посмотрел на -didSimulatePhysics метод, но это не похоже на путь.

4b9b3361

Ответ 1

Я пытаюсь настроить некоторые упругие столкновения с помощью Sprite Kit

Я думаю, вы неправильно понимаете физику здесь. Упругое столкновение является упрощением столкновения. В действительности, никакое столкновение не приводит к идеальной передаче энергии. Я объяснил физику здесь в ответ на связанный с вами вопрос.

Я подозреваю, что прочитал, что вы увидите, что в SpriteKit можно провести "упругое" столкновение, но большинство людей не понимает, что вам нужно пространство между объектами. Вам не нужно выполнять свои собственные вычисления физики.

Ответ 2

Я не уверен, что это именно то, что вы пытаетесь сделать, но если бы я хотел вычислить результаты столкновений без помощи SpriteKit, оставив всю другую физику SpriteKit, я бы сделал следующее:

  • Оставьте свойство dynamic всегда равным YES.
  • Задайте свойство categoryBitMask для каждого типа объектов.
  • Задайте свойство collisionBitMask для объекта для дизъюнкции всех категорийBitMasks, для которых вы хотите сохранить автоматические вычисления столкновений (например, стены, но не другие объекты) или просто к нулю, если вы хотите обрабатывать все столкновения вручную.
  • Задайте для свойства contactTestBitMask объект для чего-либо, для которого вы хотите вычислить столкновение вручную.
  • Вычислить и установить все результирующие скорости в didBeginContact.

(Короче говоря, исключите свои объекты из своего собственного collisionBitMask.)

Эта ссылка может быть полезна: Работа с конфликтами и контактами

Ответ 3

  • Используйте applyImpulse вместо setVelocity. Вы хотите использовать импульсы или силы, чтобы физический движок мог правильно прогреться. Использование setVelocity даст непредсказуемые результаты для очень близких или перекрывающихся объектов.

  • Убедитесь, что между объектами существует некоторое расстояние и что они не перекрываются.

  • Правильно настройте маски бит конфликтов.

Все должно работать отлично.