2017-05-27 42 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(Double(345).degreesToRadians)嗎? –

回答

2

爲了讓你的兩條線完全分開30°,你可以使用SKPhysicsJointFixed,這聽起來很像:它將兩個physicsBodies固定在一個固定位置。既然你已經有他們定位自己想要的方式,只需添加以下代碼,您有其他SKPhysicsJoints持有他們的方式:

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

如果您行節點錨點精靈的子節點(而不是場景),旋轉錨點精靈節點將會旋轉所有的線,而不會對物理做任何特殊的處理。你只需要介意錨點,以便它們正確對齊(即線的錨點在其末端而不是中心)

相關問題