У меня есть строительный кран, который имеет соединение с объектом. Шарнир отлично работает, если кран неподвижен.
Но я добавил возможность для крана двигаться слева направо, и всякий раз, когда кран собирается покинуть вид с объектом, объект ударяется о край экрана и застревает, пока кран продолжает движение. Соединение также перестает работать даже после того, как кран вернулся в поле зрения.
Вот изображение. Желтая линия вверху представляет собой путь, по которому крюк всегда следует. Идет слева направо. Золотой блок вокруг синего прямоугольника застревает. Это блок, который изначально был соединен с серым крюком крана. Но когда крючок перемещается в правую часть экрана, золотой блок попадает на край экрана и остается там навсегда.
Что для меня не имеет смысла, так это то, что край представления имеет битовую маску категории 0, а золотой блок - 64. На других уровнях золотые блоки НИКОГДА не сталкиваются с краем. Но здесь, когда кран движется к краю, золотой блок сталкивается с краем и застревает. Как вы можете видеть, суставы все еще там, основываясь на голубых физических линиях.
Это код соединения, вызываемого со сцены и настраивающего его. Как я уже сказал, шарнир работает нормально, если крючок неподвижен.
craneBase.alpha = 0
let path = CGMutablePath()
path.move(to: CGPoint(x: craneBase.position.x, y: craneBase.position.y))
path.addLine(to: CGPoint(x: craneBase.size.width - 100, y: craneBase.position.y + 10))
path.addLine(to: CGPoint(x: craneBase.position.x, y: craneBase.position.y))
craneHook.initializeMovingJoint(withObject: childNode(withName: "HookedObject") as! SKSpriteNode)
hook.run(SKAction.repeatForever(SKAction.follow(path, asOffset: false, orientToPath: false, duration: 10)))
physicsWorld.add(craneHook.joint)
Это код класса крюка крана, который добавляет соединение к блоку.
private func initHook() {
self.hookSize = CGSize(width: 10, height: 10)
self.physicsBody = SKPhysicsBody(rectangleOf: hookSize)
self.physicsBody?.categoryBitMask = PhysicsBit.none
self.physicsBody?.isDynamic = false
self.physicsBody?.affectedByGravity = false
}
//Creates the joint between the object and the hook
func initializeJoint(withObject object: SKSpriteNode) {
initHook()
hookedObject = object
jointAnchor = CGPoint(x: self.anchorPoint.x, y: self.anchorPoint.y)
joint = SKPhysicsJointFixed.joint(withBodyA: physicsBody!, bodyB: hookedObject.physicsBody!, anchor: jointAnchor)
doesHaveHookedObject = true
}
И настройки золотого блока назначаются из редактора сцены на маску категории 64. Я проверил золотые блоки, и они не сталкиваются с краем. Я не уверен, почему он сталкивается с краем во время движения.