2017-05-31 26 views
5

以下の図に示すように、腕と手を形状の分離や変更なしに、腕の中心を中心に回転させる必要がありますAでの回転)、下図のように:関節の周りのスプライトを回転させる方法

enter image description here

Iは、アームを回転しようとしたが、これは、それらがフォームを分離し、変更しました。あなたは以下の私のコードをチェックアウトすることができます:

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

共通の親ノードの腕と手の子を作ることができます。そのようなarmsParentの子として追加し、その後

let armsParent = SKNode() 

の代わりに、直接現場に子供のように腕や手を加える:あなたはそうのようなこの目的のためだけに空白SKNodeを作成することができ

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

次に、armsParentをSKActionで単に回転させて、あなたが望むものを達成することができます。

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'を追加し、' VAR 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

これはSKActionを実行した後に得たものです。http://imgur.com/Ji8k8Wx – Containment

関連する問題