2017-05-27 12 views
5

पर दो लाइनों के बीच 30˚ दूरी को कैसे रखा जाए, मैं एक निश्चित बिंदु (स्प्राइट) पर लगी हुई दो पंक्तियां बनाने की कोशिश कर रहा हूं और उनके बीच 30 डिग्री कोण बनाने के लिए घूमता हूं। नीचे एक छवि है जिसे मैं प्राप्त करना चाहता हूं।एक बिंदु

enter image description here

यह मैं अब तक क्या किया है है:

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 anchorSprite = SKSpriteNode(imageNamed: "anchorSprite") 
var armLeft = SKSpriteNode(imageNamed: "lineSprite") 
var armRight = SKSpriteNode(imageNamed: "lineSprite") 

override func didMove(to view: SKView) { 

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

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

    anchorSprite.position = CGPoint(x: frame.midX, y: frame.midY + frame.midY/2) 
    anchorSprite.zPosition = 20 

    anchorSprite.physicsBody = SKPhysicsBody(rectangleOf: anchorSprite.frame.size) 
    anchorSprite.physicsBody?.categoryBitMask = pinCategory 
    anchorSprite.physicsBody?.isDynamic = false 

    addChild(anchorSprite) 

    armRight.anchorPoint = CGPoint(x: 0.5, y: 1) 
    armRight.position = anchorSprite.position 
    armRight.zPosition = 20 
    armRight.physicsBody = SKPhysicsBody(rectangleOf: armRight.frame.size) 
    armRight.zRotation = CGFloat(Double(15).degreesToRadians)//CGFloat(Double.pi/6) 
    armRight.physicsBody!.isDynamic = true 
    addChild(armRight) 

    armLeft.anchorPoint = CGPoint(x: 0.5, y: 1) 
    armLeft.position = anchorSprite.position 
    armLeft.zPosition = 20 
    armLeft.physicsBody = SKPhysicsBody(rectangleOf: armRight.frame.size) 
    armLeft.zRotation = CGFloat(Double(-15).degreesToRadians)//CGFloat(-Double.pi/6) 
    armLeft.physicsBody!.isDynamic = true 
    addChild(armLeft) 

    //Pin joints 
    var pinAndRightArmJoint = SKPhysicsJointPin.joint(withBodyA: anchorSprite.physicsBody!, bodyB: armRight.physicsBody!, anchor: CGPoint(x: anchorSprite.position.x, y: self.armRight.frame.maxY)) 
    self.physicsWorld.add(pinAndRightArmJoint) 

    var pinAndLeftArmJoint = SKPhysicsJointPin.joint(withBodyA: anchorSprite.physicsBody!, bodyB: armLeft.physicsBody!, anchor: CGPoint(x: anchorSprite.position.x, y: self.armLeft.frame.maxY)) 
    self.physicsWorld.add(pinAndLeftArmJoint) 

} 

नीचे से ऊपर कोड (वे एक साथ करीब हैं) चलने से एक छवि है।

enter image description here

कैसे मुझे यकीन है कि लाइनों हमेशा 30˚ अलग कर रहे हैं और बनाए रखने के 30˚ अलग भी जब घुमाया कर सकते हैं?

+0

क्या आपने 'armLeft.zRotation = CGFloat (डबल (345) .degreesToRadians) की कोशिश की है? –

उत्तर

2

अपनी दो लाइनों को बिल्कुल 30 डिग्री से अलग रखने के लिए, आप SKPhysicsJointFixed का उपयोग कर सकते हैं, जो कि यह कैसा लगता है: यह एक निश्चित स्थिति में दो physicsBodies पिन करता है।

let fixArms = SKPhysicsJointFixed.joint(withBodyA: armLeft.physicsBody!, bodyB: armRight.physicsBody!, anchor: CGPoint.zero) 
self.physicsWorld.add(fixArms) 

परिणाम::

Result image

+0

यह काम कर रहा है, लेकिन मेरा एकमात्र मुद्दा भौतिकी निकाय संपर्क/टकराव अवास्तविक – iGetIt

+0

@iGetIt क्षमा करें, भौतिकी निकायों का उपयोग करके इस बारे में जाने का एक बुरा तरीका था। इसके बजाय उन्हें स्थिर रखने के लिए एक संयुक्त का उपयोग करके एक बहुत ही सरल दृष्टिकोण है। मेरा अद्यतन उत्तर देखें। – Robert

+0

@Robert कृपया मेरा प्रश्न देखें। यदि आप https://stackoverflow.com/questions/44294768/how-to-rotate-sprites-around-a-joint की सहायता कर सकते हैं तो मैं बहुत आभारी रहूंगा – Containment

0

आप लाइन करते हैं जब से तुम उन्हें पहले से ही तैनात जिस तरह से आप चाहते हैं, तो बस इस कोड जहाँ आप अन्य SKPhysicsJoints उन्हें उस तरह से पकड़ करने के लिए जोड़ एंकर स्प्राइट (दृश्य के बजाए) नोड्स, एंकर स्प्राइट नोड घूर्णन भौतिकी के साथ कुछ भी विशेष किए बिना इसके साथ सभी लाइनों को घुमाएगा। आपको केवल एंकर पॉइंट्स को ध्यान में रखना होगा ताकि वे सही ढंग से संरेखित हों (यानी लाइन के एंकर को केंद्र की बजाय इसके चरम पर)

संबंधित मुद्दे