2017-05-31 22 views
5

Muszę sprawić, aby ramiona i dłonie obracały się wokół środka haka, jak pokazano na poniższym obrazku, bez oddzielania lub zmiany ich kształtu (brak zmian w kątach między rękami i rękami po prostu obrót w a), a na obrazie poniżej:Jak obracać sprite wokół stawu

enter image description here

że próbował obracania ramion ale się do nich oddzielne i zmiany formy. Możesz sprawdzić mojego kodu poniżej:

let hookCategoryName = "hook" 
let leftArmCategoryName = "leftArm" 
let rightArmCategoryName = "rightArm" 
let leftHandCategoryName = "leftHand" 
let rightHandCategoryName = "rightHand" 

let hookCategory    : UInt32 = 0x1 << 0 
let leftArmCategory   : UInt32 = 0x1 << 1 
let rightArmCategory   : UInt32 = 0x1 << 2 
let leftHandCategory   : UInt32 = 0x1 << 3 
let rightHandCategory   : UInt32 = 0x1 << 4 

extension Int { 
    var degreesToRadians: Double { return Double(self) * .pi/180 } 
} 
extension FloatingPoint { 
    var degreesToRadians: Self { return self * .pi/180 } 
    var radiansToDegrees: Self { return self * 180/.pi } 
} 

class GameScene: SKScene, SKPhysicsContactDelegate { 

var hook = SKSpriteNode(imageNamed: "hook") 
var leftArm = SKSpriteNode(imageNamed: "arm") 
var rightArm = SKSpriteNode(imageNamed: "arm") 
var leftHand = SKSpriteNode(imageNamed: "leftHand") 
var rightHand = SKSpriteNode(imageNamed: "rightHand") 

override func didMove(to view: SKView) { 

    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0) 
    self.physicsWorld.contactDelegate = self 

    var yellowBg = SKSpriteNode(imageNamed: "yellowBg") 
    yellowBg.position = CGPoint(x: frame.midX, y: frame.midY) 
    yellowBg.zPosition = 2 
    addChild(yellowBg) 

    hook.position = CGPoint(x: frame.midX, y: frame.midY + frame.midY/2) 
    hook.zPosition = 5 
    hook.name = hookCategoryName 
    hook.physicsBody = SKPhysicsBody(rectangleOf: hook.frame.size) 
    hook.physicsBody?.categoryBitMask = hookCategory 
    hook.physicsBody?.isDynamic = false 
    addChild(hook) 

    rightArm.anchorPoint = CGPoint(x: 0.5, y: 1) 
    rightArm.position = hook.position 
    rightArm.zPosition = 5 
    rightArm.name = rightArmCategoryName 
    rightArm.physicsBody = SKPhysicsBody(rectangleOf: rightArm.frame.size) 
    rightArm.physicsBody?.categoryBitMask = rightArmCategory 

    rightArm.physicsBody!.isDynamic = true 
    addChild(rightArm) 

    leftArm.anchorPoint = CGPoint(x: 0.5, y: 1) 
    leftArm.position = hook.position 
    leftArm.zPosition = 5 
    leftArm.name = leftArmCategoryName 
    leftArm.physicsBody = SKPhysicsBody(rectangleOf: leftArm.frame.size) 
    leftArm.physicsBody?.categoryBitMask = leftArmCategory 
    leftArm.physicsBody!.isDynamic = true 

    addChild(leftArm) 

    // leftHand 
    leftHand.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    leftHand.position = CGPoint(x: leftArm.frame.minX - 22, y: leftArm.frame.minY + 7) //CGPoint(x: armLeft.position.x, y: armLeft.position.y) 
    leftHand.zPosition = 5 
    leftHand.name = leftHandCategoryName 
    leftHand.physicsBody = SKPhysicsBody(rectangleOf: leftHand.frame.size) 
    leftHand.physicsBody?.categoryBitMask = leftHandCategory 

    leftHand.zRotation = CGFloat(Double(-30).degreesToRadians)//CGFloat(-Double.pi/6) 
    //armLeft.physicsBody?.categoryBitMask = armCategory 
    leftHand.physicsBody!.isDynamic = true 

    addChild(leftHand) 

    // rightHand 
    rightHand.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    rightHand.position = CGPoint(x: rightArm.frame.minX + 30, y: rightArm.frame.minY + 7) //CGPoint(x: armLeft.position.x, y: armLeft.position.y) 
    rightHand.zPosition = 5 
    rightHand.name = rightHandCategoryName 

    rightHand.physicsBody = SKPhysicsBody(rectangleOf: rightHand.frame.size) 
    rightHand.physicsBody?.categoryBitMask = rightHandCategory 
    rightHand.zRotation = CGFloat(Double(30).degreesToRadians)//CGFloat(-Double.pi/6) 
    //armLeft.physicsBody?.categoryBitMask = armCategory 
    rightHand.physicsBody!.isDynamic = true 

    addChild(rightHand) 


    leftArm.zRotation = CGFloat(Double(-45).degreesToRadians) 
    rightArm.zRotation = CGFloat(Double(45).degreesToRadians) 

    rightHand.physicsBody?.contactTestBitMask = rightHandCategory 
    leftHand.physicsBody?.contactTestBitMask = leftHandCategory 
    rightHand.physicsBody?.collisionBitMask = rightHandCategory 
    leftHand.physicsBody?.collisionBitMask = leftHandCategory 


    let hookAndRightArmJoint = SKPhysicsJointPin.joint(withBodyA: hook.physicsBody!, bodyB: rightArm.physicsBody!, anchor: CGPoint(x: hook.position.x, y: self.rightArm.frame.maxY)) 
    self.physicsWorld.add(hookAndRightArmJoint) 

    let hookAndLeftArmJoint = SKPhysicsJointPin.joint(withBodyA: hook.physicsBody!, bodyB: leftArm.physicsBody!, anchor: CGPoint(x: hook.position.x, y: self.leftArm.frame.maxY)) 
    self.physicsWorld.add(hookAndLeftArmJoint) 


    let armsFixedJoint = SKPhysicsJointFixed.joint(withBodyA: leftArm.physicsBody!, bodyB: rightArm.physicsBody!, anchor: CGPoint.zero) 
    self.physicsWorld.add(armsFixedJoint) 

    //left arm and hand joint 
    let leftArmAndHandJoint = SKPhysicsJointPin.joint(withBodyA: leftArm.physicsBody!, bodyB: leftHand.physicsBody!, anchor: CGPoint(x: self.leftArm.frame.minX, y: self.leftArm.frame.minY)/*CGPoint(x: armLeft.position.x, y: self.armLeft.frame.minY)*/) 
    self.physicsWorld.add(leftArmAndHandJoint) 

    //right arm and hand joint 
    let rightArmAndHandJoint = SKPhysicsJointPin.joint(withBodyA: rightArm.physicsBody!, bodyB: rightHand.physicsBody!, anchor: CGPoint(x: self.rightArm.frame.maxX, y: self.rightArm.frame.minY)/*CGPoint(x: armLeft.position.x, y: self.armLeft.frame.minY)*/) 
    self.physicsWorld.add(rightArmAndHandJoint) 
} 

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 

    hook.run(SKAction.rotate(byAngle: CGFloat(Double(60).degreesToRadians), duration: 0.5)) 

} 
} 

także obracanie haka nie ma wpływu na ramiona i ręce, jak widać na obrazku poniżej, gdy powyższy kod jest uruchamiany:

enter image description here

Jak czy mogę uzyskać obrót pierwszego obrazu?

Odpowiedz

0

Możesz uczynić z rąk i rąk dzieci wspólnego węzła nadrzędnego. Można utworzyć pusty SKNode tylko dla tego celu tak:

let armsParent = SKNode() 

Wtedy zamiast dodawania ramion i rąk dzieci do sceny bezpośrednio, dodaj je jako dzieci armsParent tak:

armsParent.addChild(leftArm) 
armsParent.addChild(rightArm) // same for hands... 

Następnie można po prostu obrócić ramionaParent za pomocą SKAction, aby osiągnąć to, co chcesz.

OR, aby uczynić go jeszcze prostsze, można po prostu dodać ramion i rąk dzieci hook bezpośrednio tak:

hook.addChild(leftArm) // same for other arm and hands... 

Ponieważ ramiona i ręce dzieci hook lub armParent ich pozycji będzie teraz być ustalone względem ich rodzica. W związku z tym konieczne może być zmienienie całego kodu inicjowania .position =.

+0

Jak mam teraz tworzyć i dodawać stawy? W kodzie w moim pytaniu zrobiłem to w następujący sposób 'let hookAndRightArmJoint = SKPhysicsJointPin.joint (withBodyA: hook.physicsBody !, bodyB: rightArm.physicsBody !, anchor: CGPoint (x: hook.position.x, y: rightArm .frame.maxY)) self.physicsWorld.add (hookAndRightArmJoint) 'Nie jestem pewien jak to teraz zrobić. – Containment

+0

I dodaje 'armsParent' w następujący sposób' var armsParent = SKNode() armsParent.position = hook.position armsParent.zPosition = 10 addChild (armsParent) 'a także wykonać następujące SKAction na nim' armsParent. uruchom (SKAction.rotate (byAngle: CGFloat (Double (60) .degreesToRadians), czas trwania: 0.5)) 'ale nie obraca się. – Containment

+0

To jest link do tego, co otrzymałem po uruchomieniu SKAction http://imgur.com/Ji8k8Wx – Containment