オブジェクトとのジョイントがある建設用クレーンがあります。クレーンが静止している場合、ジョイントは正常に機能します。
しかし、クレーンが左から右に移動する機能を追加しました。クレーンがオブジェクトと一緒にビューを離れようとすると、オブジェクトは画面の端にぶつかり、クレーンが動き続ける間スタックします。クレーンがビューに戻った後もジョイントが機能しなくなります。
これが画像です。上部の黄色い線は、フックが永遠にたどる経路を表しています。左から右に進みます。引っかかっているのは、青い四角形の周りにある金のブロックです。それはもともとクレーンの灰色のフックに接続されていたブロックです。しかし、フックがビューの右側に移動すると、金のブロックが画面の端にぶつかり、そこに永遠にとどまります。
私にとって意味をなさないのは、ビューの端のカテゴリ ビット マスクが 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 のカテゴリ マスクに割り当てられます。金ブロックをテストしましたが、エッジと衝突しません。移動中にエッジに衝突する理由がわかりません。