如果对象将移出视图,为什么物理关节会停止工作?

Why does the physics joint stop working if the object will move out of the view?

我有一台建筑起重机,它与一个物体有一个接头。如果起重机静止,接头工作正常。

但是我添加了起重机从左向右移动的能力,每当起重机将带着物体离开视野时,物体撞到屏幕边缘并被卡住,而起重机继续前进。即使在起重机回到视野后,关节也会停止工作。

这是一张图片。顶部的黄线代表钩子永远遵循的路径。它从左到右。蓝色矩形周围的金块被卡住了。那是最初与起重机的灰色挂钩连接的块。但是当钩子移动到视图的右侧时,金块会碰到屏幕的边缘并永远停留在那里。

对我来说没有意义的是,视图边缘的类别位掩码为 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)

这是起重机吊钩的代码 class,它将关节添加到块中。

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 的类别掩码。我已经测试了金块并且它们不会与边缘碰撞。我不确定为什么它在移动时会撞到边缘。

我意识到它不起作用,因为关节和 physicsWorld 具有相同的类别位掩码。尽管金块具有不同的位掩码,但它是关节的一部分,因此与 none.

相同类别的位掩码发生冲突