Sprite Kit меняет опорную точку, но сохраняет физическое тело в центре

У меня много разных узлов спрайтов с физическим телом такого же размера, что и объект. Для позиционирования мне нужно изменить опорную точку node, но это также меняет положение физического тела. Есть ли способ сохранить опорную точку для центра физики? Использование пути для физического тела не является вариантом, потому что у меня так много разных объектов.

Ответ 1

anchorPoint - чисто визуальное свойство, оно определяет, как текстура рисуется относительно позиции node. Физический корпус остается незатронутым, изменяя anchorPoint, он остается в центре на node position.

Итак, в каком-то смысле физическое тело делает уже сосредоточенным на позиции спрайта. Изменив anchorPoint, вы просто изменили место, где отображается текстура спрайта, и я полагаю, что вы предположили, что физическое тело будет сосредоточено на sprite anchorPoint. Это не так, поскольку каждый node может иметь физическое тело, но только несколько узлов (спрайт, сцена, видео) имеют свойство anchorPoint.

Лучший способ исправить это - создать свои спрайты, чтобы тело физики всегда считалось ориентированным на изображение. Оставьте прозрачные рамки вокруг изображения, чтобы гарантировать, что размер изображения всегда одинаковый, а положение тела равномерно центрировано.

Вы также можете использовать инициализатор SKPhysicsBody bodyWithRectangleOfSize:center:, чтобы определить центральную точку тела и сопоставить его с помощью спрайта anchorPoint. Но это сложно и контрпродуктивно, так как вам придется постоянно перестраивать body и sprite anchorPoint, если вы сделаете даже самые незначительные изменения.

Кроме того, лучше всего оставить anchorPoint отдельно, особенно с физикой.

Ответ 2

Старый поток, но все же появляется, когда я искал Google... Вот как я решил проблему для себя.

Я по существу просто уложил свои SKSpriteNodes. Главный узел верхнего уровня получит SKPhysicsBody, чтобы все объекты оставались вместе. Если вы добавите объект SKPhysicsBody в качестве дочернего элемента в другой узел, физическое устройство может существенно выпасть из других узлов (изображения будут оставлены плавающими в моем случае), когда применяются силы тяжести или другие силы и могут возвращать некоторые неуловимые результаты, осторожно.

Для дальнейшего уточнения:

  • Родительский узел без связанного с ним изображения/текстуры, просто размер, а затем физический. (Этот узел имел модифицированную опорную точку)
  • Затем я добавил дочерний узел с моей текстурой тела. (позиция должна была быть скорректирована, чтобы компенсировать опорную точку родителя)
  • Наконец, я добавил еще два дочерних узла в "тело", чтобы создать глаза.

Это специально позволяет использовать текстурированный SKPhysicsBody или что-то более сложное, у которого нет возможности центрирования. Физическая работа работала так же, как мне была нужна, пока я все еще могу манипулировать SKActions тем способом, которым позволяет модифицированная опорная точка.

Надеюсь, это поможет кому-то.