Почему физический сустав перестает работать, если объект уходит из поля зрения?

У меня есть строительный кран, который имеет соединение с объектом. Шарнир отлично работает, если кран неподвижен.

Но я добавил возможность для крана двигаться слева направо, и всякий раз, когда кран собирается покинуть вид с объектом, объект ударяется о край экрана и застревает, пока кран продолжает движение. Соединение также перестает работать даже после того, как кран вернулся в поле зрения.

Вот изображение. Желтая линия вверху представляет собой путь, по которому крюк всегда следует. Идет слева направо. Золотой блок вокруг синего прямоугольника застревает. Это блок, который изначально был соединен с серым крюком крана. Но когда крючок перемещается в правую часть экрана, золотой блок попадает на край экрана и остается там навсегда.

Что для меня не имеет смысла, так это то, что край представления имеет битовую маску категории 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. Я проверил золотые блоки, и они не сталкиваются с краем. Я не уверен, почему он сталкивается с краем во время движения.


person Jose Ramirez    schedule 20.12.2016    source источник
comment
это потому, что управление памятью, если физический объект вне поля зрения, то он останавливается   -  person Özgür Ersil    schedule 20.12.2016
comment
Можно ли как-то это исправить или это связано с физическими суставами?   -  person Jose Ramirez    schedule 20.12.2016
comment
попробуйте определить вашу сцену больше, чем вид, может быть, тогда она будет работать в этих пределах.   -  person Özgür Ersil    schedule 20.12.2016
comment
Я, наконец, понял это благодаря вашему предложению. Даже после увеличения экрана я понял, что это не работает, потому что, хотя золотой блок имел другую категорию, чем контур сцены, стык имел ту же категорию, что и сцена. Они оба были установлены на none.   -  person Jose Ramirez    schedule 25.12.2016


Ответы (1)


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

person Jose Ramirez    schedule 25.12.2016