У меня есть пара вопросов, и они могут быть связаны, а могут и не быть. У меня есть персонаж-альпинист, у него есть туловище, левая рука, правая рука, левая рука и правая рука. Каждая рука имеет SKPhysicsJointPin на руке, а каждая рука имеет SKPhysicsJointPin на туловище. На все руки, кроме двух, действует гравитация, поэтому тело свисает с рук. Я использую 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)