2017-05-31 20 views
5

Tôi cần phải làm cho cánh tay và bàn tay xoay quanh trung tâm của móc, như thể hiện trong hình dưới đây mà không có họ tách hoặc thay đổi hình dạng của họ (không có thay đổi trong các góc giữa cánh tay và bàn tay chỉ luân phiên tại A), như trong hình dưới đây:Làm thế nào để xoay sprites xung quanh một doanh

enter image description here

tôi đã cố gắng xoay tay nhưng điều này làm cho họ mẫu riêng và thay đổi. Bạn có thể kiểm tra mã của tôi dưới đây:

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

} 
} 

Cũng xoay móc đã không ảnh hưởng đến cánh tay và bàn tay như đã thấy trong hình dưới đây khi mã trên được điều hành:

enter image description here

thế nào tôi có thể quay vòng trong hình ảnh đầu tiên không?

Trả lời

0

Bạn có thể đặt tay và tay trẻ em của nút cha mẹ chung. Bạn có thể tạo một trống SKNode chỉ cho mục đích này như sau:

let armsParent = SKNode() 

Sau đó, thay vì thêm cánh tay và bàn tay như trẻ em đến hiện trường trực tiếp, thêm chúng như con của armsParent như vậy:

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

Sau đó, bạn có thể chỉ cần xoay armsParent với một SKAction để đạt được những gì bạn muốn.

OR, để làm cho nó thậm chí còn đơn giản hơn, bạn chỉ có thể thêm cánh tay và bàn tay như trẻ em hook trực tiếp như thế này:

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

Kể từ khi cánh tay và bàn tay là con của hook hoặc armParent vị trí của họ bây giờ sẽ được xác định tương đối với cha mẹ của họ. Vì vậy, bạn có thể phải thay đổi tất cả mã khởi tạo .position = để thích ứng với điều này.

+0

bây giờ tôi giả sử như thế nào để tạo và thêm các khớp? Trong đoạn mã trong câu hỏi của tôi, tôi đã làm nó theo cách sau đây 'let hookAndRightArmJoint = SKPhysicsJointPin.joint (withBodyA: hook.physicsBody !, bodyB: rightArm.physicsBody !, anchor: CGPoint (x: hook.position.x, y: rightArm .frame.maxY)) self.physicsWorld.add (hookAndRightArmJoint) 'Tôi không chắc làm thế nào điều này được thực hiện ngay bây giờ. – Containment

+0

tôi thêm 'armsParent' theo cách sau' var armsParent = SKNode() armsParent.position = hook.position armsParent.zPosition = 10 addChild (armsParent) 'và cũng chạy SKAction sau trên nó' armsParent. chạy (SKAction.rotate (byAngle: CGFloat (Double (60) .degreesToRadians), duration: 0.5)) 'nhưng nó không xoay. – Containment

+0

Đây là một liên kết đến những gì tôi nhận được sau khi chạy SKAction http://imgur.com/Ji8k8Wx – Containment

Các vấn đề liên quan