Выполнение собственных вычислений физики для столкновения в наборе Sprite
Я пытаюсь настроить некоторые упругие столкновения с помощью Sprite Kit. Существует проблема с случаем, когда несколько объектов находятся рядом друг с другом, как я спросил в Проблема столкновения с физикой Sprite Kit
Я запутался в сроках ситуации для столкновения.
Я попытался установить dynamic
в NO
в -didBeginContact:
метод делегата, вычислить конечные скорости, затем в -didEndContact:
установить dynamic
в YES
, а затем правильно установить скорости.
Причина, по которой я хочу, чтобы она была динамической вне столкновения, заключается в том, что я хочу, чтобы трение/гравитация и т.д. были доступны. Что не так с порядком/логикой? Я посмотрел на -didSimulatePhysics
метод, но это не похоже на путь.
Ответы
Ответ 1
Я пытаюсь настроить некоторые упругие столкновения с помощью Sprite Kit
Я думаю, вы неправильно понимаете физику здесь. Упругое столкновение является упрощением столкновения. В действительности, никакое столкновение не приводит к идеальной передаче энергии. Я объяснил физику здесь в ответ на связанный с вами вопрос.
Я подозреваю, что прочитал, что вы увидите, что в SpriteKit можно провести "упругое" столкновение, но большинство людей не понимает, что вам нужно пространство между объектами. Вам не нужно выполнять свои собственные вычисления физики.
Ответ 2
Я не уверен, что это именно то, что вы пытаетесь сделать, но если бы я хотел вычислить результаты столкновений без помощи SpriteKit, оставив всю другую физику SpriteKit, я бы сделал следующее:
- Оставьте свойство
dynamic
всегда равным YES
.
- Задайте свойство
categoryBitMask
для каждого типа объектов.
- Задайте свойство
collisionBitMask
для объекта для дизъюнкции всех категорийBitMasks, для которых вы хотите сохранить автоматические вычисления столкновений (например, стены, но не другие объекты) или просто к нулю, если вы хотите обрабатывать все столкновения вручную.
- Задайте для свойства
contactTestBitMask
объект для чего-либо, для которого вы хотите вычислить столкновение вручную.
- Вычислить и установить все результирующие скорости в
didBeginContact
.
(Короче говоря, исключите свои объекты из своего собственного collisionBitMask
.)
Эта ссылка может быть полезна: Работа с конфликтами и контактами
Ответ 3
-
Используйте applyImpulse вместо setVelocity. Вы хотите использовать импульсы или силы, чтобы физический движок мог правильно прогреться. Использование setVelocity даст непредсказуемые результаты для очень близких или перекрывающихся объектов.
-
Убедитесь, что между объектами существует некоторое расстояние и что они не перекрываются.
-
Правильно настройте маски бит конфликтов.
Все должно работать отлично.