我在这里有几个问题,它们可能相关也可能不相关。我有一个角色是登山者,它有躯干、左臂、右臂、左手和右手。每只手的手臂都有一个 SKPhysicsJointPin,每只手臂的躯干都有一个 SKPhysicsJointPin。除了两只手外,所有的手都受到重力的影响,所以身体从手上垂下来。我使用 SKAction 将每只手向上移动并将身体向上拉。一只手被锁定,而另一只手自由移动。锁定的手将代表“握住”岩石。我最初使用矩形来测试这一点。每当我“伸手”太远时,关节就会开始拉开。为了解决这个问题,我限制了一次可以达到多远以将关节保持在一起。我上传了一些图像来替换矩形,它们使用 alpha 蒙版来映射它们的真实形状。现在当我测试时,躯干向左摆动一点就会卡住。关节将开始伸展,手和手臂开始分开。有时它会清除所有这些并回忆起自己,但所有关节仍然会分开。
为什么从矩形切换到图像时会有这样的变化?这是一个错误吗?我怎样才能以不会像这样拉开的方式使用这些关节?我已经搞砸了所有设置,包括删除所有约束等等,但仍然是同样的问题。
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)