我有一台与物体连接的建筑起重机。如果起重机是静止的,则接头工作正常。
但是我添加了起重机从左到右移动的能力,每当起重机即将与物体一起离开视野时,物体就会撞到屏幕边缘并在起重机继续行驶时卡住。即使在起重机回到视野后,接头也会停止工作。
这是一张图片。顶部的黄线代表钩子永远遵循的路径。它从左到右。蓝色矩形周围的金块是卡住的。那是最初与起重机的灰色钩子连接的块。但是当钩子移动到视图的右侧时,金块会碰到屏幕的边缘并永远停留在那里。
对我来说没有意义的是视图边缘的类别位掩码为 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 的类别蒙版。我已经测试了金块,它们不会与边缘发生碰撞。我不确定为什么它在移动时会与边缘发生碰撞。