В последнее время я репетировал Sprite Kit и столкнулся с очень странной проблемой. При масштабировании (изменении масштаба) родительского узла тела, которые соединяются вместе с помощью SKPhysicsJointPin, постепенно отделяются друг от друга, а затем соединения ломаются. Позвольте мне показать вам изображения.
Это для нормального состояния:
Вот при увеличении:
А вот при уменьшении:
Если вы спросите, как я соединяю тела: я соединяю коричневые палочки с синими узлами в центре синих узлов. Есть идеи, в чем моя проблема?
РЕДАКТИРОВАТЬ: Недавно я обнаружил, что суставы не ломаются, и все работает, как и ожидалось, когда соединяющиеся тела не являются динамическими. Например, если я использую [SKPhysicsBody bodyWithEdgleLoopFromRect] вместо [SKPhysicsBody bodyWithRectangleOfSize] для создания физического тела спрайта, проблем не возникает. Но мне нужно, чтобы тела были динамичными.
Вот код, который я использую для привязки физики к узлам. Конечно, все это делается динамически. Я просто жестко закодировал для краткости.
-(void)attachPhysics{
//fixedComponentLeft & fixedComponentRight are two SKSprites
fixedComponentLeft.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.frame.size.width];
fixedComponentRight.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:fixedComponentLeft.size.width];
beam1.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam1.size];
joiningBody.physicsBody=[SKPhysicsBody bodyWithCircleOfRadius:joiningBody1.size.width];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentLeft.physicsBody bodyB:beam1.physicsBody anchor:fixedComponentLeft.position]];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam1.physicsBody anchor:beam1.endPoint]];
beam2.physicsBody=[SKPhysicsBody bodyWithRectangleOfSize:beam2.size];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:joiningBody.physicsBody bodyB:beam2.physicsBody anchor:beam2.position]];
[self.scene.physicsWorld addJoint:[SKPhysicsJointPin jointWithBodyA:fixedComponentRight.physicsBody bodyB:beam2.physicsBody anchor:beam2.endPoint]];
}
В приведенном выше коде луч1 и луч2 являются экземплярами подкласса SKSpriteNode. По умолчанию точка привязки равна (0,0,5), и я добавил свойство endPoint, которое служит крайней правой точкой спрайта.