ここにはいくつかの問題があり、それらは関連している場合と関連していない場合があります。クライマーのキャラクターがいて、胴体、左腕、右腕、左手、右手があります。各手には腕に SKPhysicsJointPin があり、各腕には胴体に SKPhysicsJointPin があります。2 本の手以外はすべて重力の影響を受けるため、体は手からぶら下がっています。SKAction を使用して、それぞれの手を上に動かし、体を引き上げます。一方の手はロックされ、もう一方の手は自由に動きます。ロックされた手は、岩を「つかむ」ことを表します。最初にこれをテストするために長方形を使用しました。私が「手を伸ばし」すぎると、関節がバラバラになり始めました。これを修正するために、関節を一緒に保つために一度に到達できる距離を制限しました。長方形を置き換えるためにいくつかの画像をアップロードし、アルファ マスクを使用して実際の形状をマッピングします。今、私がテストすると、胴体は少し左に振った途端に引っ掛かります。関節が伸び始め、手と腕が離れ始めます。時々、これらすべてをクリアして自分自身を思い出すことがありますが、それでもすべての関節が引き離されます.
長方形から画像に切り替えると、なぜこのような変化が生じるのでしょうか? これはバグですか?これらのジョイントをこのように引き離さない方法で使用するにはどうすればよいですか? すべての制約などを削除するなど、すべての設定をいじりましたが、それでも同じ問題です。
torso = (self.childNode(withName: "yeti_torso_1") as? SKSpriteNode)!
//torso.physicsBody = SKPhysicsBody(texture: torso.texture!,size: torso.texture!.size())
torso.physicsBody?.isDynamic = true
torso.physicsBody?.usesPreciseCollisionDetection = true
torso.physicsBody?.collisionBitMask = noCategory
let constraint = SKConstraint.zRotation(SKRange(lowerLimit: degreesToRadians(degrees: -30.0), upperLimit: degreesToRadians(degrees: 30.0)))
torso.constraints = [constraint]
leftHand = (self.childNode(withName: "yeti_left_hand_regular") as? SKSpriteNode)!
leftHand.physicsBody?.collisionBitMask = noCategory
leftArm = (self.childNode(withName: "yeti_left_arm") as? SKSpriteNode)!
leftArm.physicsBody?.collisionBitMask = noCategory
leftArm.zPosition = 2
rightHand = (self.childNode(withName: "yeti_right_hand_regular") as? SKSpriteNode)!
rightHand.physicsBody?.collisionBitMask = noCategory
rightArm = (self.childNode(withName: "yeti_right_arm") as? SKSpriteNode)!
rightArm.physicsBody?.collisionBitMask = noCategory
rightArm.zPosition = 2
//Left Wrist Joint
let leftWristJoint = SKPhysicsJointPin.joint(
withBodyA: leftHand.physicsBody!,
bodyB: leftArm.physicsBody!,
anchor: CGPoint(
x: leftHand.frame.midX-10,
y: leftHand.frame.midY-10))
leftWristJoint.shouldEnableLimits = true
leftWristJoint.lowerAngleLimit = degreesToRadians(degrees: 0.0)
leftWristJoint.upperAngleLimit = degreesToRadians(degrees: 90.0)
leftWristJoint.frictionTorque = 1
self.physicsWorld.add(leftWristJoint)
//Right Wrist Joint
let rightWristJoint = SKPhysicsJointPin.joint(
withBodyA: rightHand.physicsBody!,
bodyB: rightArm.physicsBody!,
anchor: CGPoint(
x: rightHand.frame.midX+10,
y: rightHand.frame.midY-10))
rightWristJoint.shouldEnableLimits = true
rightWristJoint.lowerAngleLimit = degreesToRadians(degrees: 0.0)
rightWristJoint.upperAngleLimit = degreesToRadians(degrees: 90.0)
rightWristJoint.frictionTorque = 1
self.physicsWorld.add(rightWristJoint)
//Left Arm Joint
let leftArmJoint = SKPhysicsJointPin.joint(
withBodyA: torso.physicsBody!,
bodyB: leftArm.physicsBody!,
anchor: CGPoint(
x: torso.frame.minX+100,
y: torso.frame.maxY-110))
leftArmJoint.shouldEnableLimits = true
// leftArmJoint.lowerAngleLimit = degreesToRadians(degrees: -145.0)
//leftArmJoint.upperAngleLimit = degreesToRadians(degrees: 80.0)
leftArmJoint.frictionTorque = 1
self.physicsWorld.add(leftArmJoint)
//Right Arm Joint
let rightArmJoint = SKPhysicsJointPin.joint(
withBodyA: torso.physicsBody!,
bodyB: rightArm.physicsBody!,
anchor: CGPoint(
x: torso.frame.maxX-50,
y: torso.frame.maxY-110))
rightArmJoint.shouldEnableLimits = true
//rightArmJoint.lowerAngleLimit = degreesToRadians(degrees: -80.0)
// rightArmJoint.upperAngleLimit = degreesToRadians(degrees: 145.0)
rightArmJoint.frictionTorque = 1
self.physicsWorld.add(rightArmJoint)
画面上をドラッグして手を上げると手が移動します
let td = CGVect(touchBegan,touchCurrent)
let move = SKAction.move(by: td, duration: 0)
hand.run(move)