如果对象将移出视图,为什么物理关节会停止工作?
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.
相同类别的位掩码发生冲突
我有一台建筑起重机,它与一个物体有一个接头。如果起重机静止,接头工作正常。
但是我添加了起重机从左向右移动的能力,每当起重机将带着物体离开视野时,物体撞到屏幕边缘并被卡住,而起重机继续前进。即使在起重机回到视野后,关节也会停止工作。
这是一张图片。顶部的黄线代表钩子永远遵循的路径。它从左到右。蓝色矩形周围的金块被卡住了。那是最初与起重机的灰色挂钩连接的块。但是当钩子移动到视图的右侧时,金块会碰到屏幕的边缘并永远停留在那里。
对我来说没有意义的是,视图边缘的类别位掩码为 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.
相同类别的位掩码发生冲突