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