2017-05-31 68 views
5

我需要使手臂和手部繞着鉤子的中心旋轉,如下圖所示,而不會分開或更改其形狀(手臂和手之間的角度沒有變化在A處的旋轉),如下圖所示:如何旋轉關節周圍的精靈

enter image description here

我試圖旋轉臂但這使他們分離的和變化的形式。你可以看看我下面的代碼:

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)) 

} 
} 

而且旋轉鉤對胳膊和手沒有效果時,上面的代碼運行,如下圖所示:

enter image description here

如何我可以在圖像第一張圖像中獲得旋轉嗎?

回答

0

您可以製作共同父節點的雙手和雙手兒童。你可以創建一個空白SKNode只是這個目的,像這樣:

let armsParent = SKNode() 

然後,而不是添加的胳膊和手的孩子直接現場,將其添加爲armsParent的孩子,像這樣:

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

然後,您可以簡單地使用SKAction來旋轉armsParent以實現您想要的效果。

OR,使其更簡單,你可以只爲孩子添加手臂和手hook直接像這樣:

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

由於手臂和手的hookarmParent自己的立場孩子現在相對於他們的父母來確定。因此,您可能必須更改所有.position =初始化代碼以適應此情況。

+0

我現在想如何創建和添加關節?在我的問題代碼中,我做了以下方式'let hookAndRightArmJoint = SKPhysicsJointPin.joint(withBodyA:hook.physicsBody!,bodyB:rightArm.physicsBody !, anchor:CGPoint(x:hook.position.x,y:rightArm .frame.maxY)) self.physicsWorld.add(hookAndRightArmJoint) '我不知道現在該怎麼做。 – Containment

+0

我添加了'armsParent'以下列方式'變種armsParent = SKNode() armsParent.position = hook.position armsParent.zPosition = 10 的addChild(armsParent) ',並且還在其上運行'armsParent以下SKAction。運行(SKAction.rotate(byAngle:CGFloat(Double(60).degreesToRadians),duration:0.5))'但它沒有旋轉。 – Containment

+0

這是我運行SKA後獲得的鏈接http://imgur.com/Ji8k8Wx – Containment