2016-03-23 29 views
1

私は平方形を構成する4つのSKSpriteNodesからなるSKNodeを持っています(私はそれが正しいと言いたいと思います)。正方形の各辺は色が異なり、私はその位置を変えずに正方形全体を回転しようとしています。私が努力している方法は、回転を開始するときに常にその位置を変えるように誘導しています。SKNodeの位置を変更せずにSKNodeを回転するにはどうすればいいですか?

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var shape = SKNode() 

    override func didMoveToView(view: SKView) { 

    self.addChild(shape) 
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0) 
    self.physicsWorld.contactDelegate = self 

    let greenLine = SKSpriteNode(imageNamed: "Green") 
    greenLine.position = CGPoint(x: size.width/2, y: size.height/2.5) 

    let yellowLine = SKSpriteNode(imageNamed: "Yellow") 
    yellowLine.position = CGPoint(x: greenLine.position.x - greenLine.frame.width/2, y: frame.size.height/2) 

    let redLine = SKSpriteNode(imageNamed: "Red") 
    redLine.position = CGPoint(x: greenLine.position.x + greenLine.frame.width/2, y: frame.size.height/2) 
    let blueLine = SKSpriteNode(imageNamed: "Blue") 
    blueLine.position = CGPoint(x: frame.size.width/2, y: redLine.position.y + redLine.frame.height/2.3) 

    shape.addChild(greenLine) 
    shape.addChild(yellowLine) 
    shape.addChild(redLine) 
    shape.addChild(blueLine) 

    let rotateAction = SKAction.rotateByAngle(CGFloat(M_PI_4) * 2, duration: 5) 
    shape.runAction(rotateAction) 
} 

私もzRotationを試してみましたが、それはまったく動作しませんでした:これは私がそれに近づいてきた方法です。 SKActionでローテーションが発生すると、同じ場所にとどまるのではなく、回転しながら全体のシェイプを左に引きます。

編集

コード:

var shape = SKNode() 

override func didMoveToView(view: SKView) { 

    self.addChild(shape) 
    self.physicsWorld.gravity = CGVectorMake(0.0, 0.0) 
    self.physicsWorld.contactDelegate = self 

    backgroundColor = UIColor.whiteColor() 

    let greenLine = SKSpriteNode(imageNamed: "Green") 
    greenLine.position = CGPoint(x: frame.size.width/2, y: frame.size.height/2.5) 

    let yellowLine = SKSpriteNode(imageNamed: "Yellow") 
    yellowLine.position = CGPoint(x: greenLine.position.x - greenLine.frame.width/2, y: frame.size.height/2) 

    let redLine = SKSpriteNode(imageNamed: "Red") 
    redLine.position = CGPoint(x: greenLine.position.x + greenLine.frame.width/2, y: frame.size.height/2) 

    let blueLine = SKSpriteNode(imageNamed: "Blue") 
    blueLine.position = CGPoint(x: frame.size.width/2, y: redLine.position.y + redLine.frame.height/2.3) 

    shape.position = CGPoint(x: 0, y: 0) 
    shape.addChild(greenLine) 
    shape.addChild(yellowLine) 
    shape.addChild(redLine) 
    shape.addChild(blueLine) 

    let center = SKSpriteNode(color: .redColor(), size: CGSize(width: 50, height: 50)) 
    center.position = CGPoint(x: frame.midX, y: frame.midY) 
    shape.addChild(center) 

    let rotateAction = SKAction.rotateByAngle(CGFloat(M_PI_4) * 2, duration: 30) 
    shape.runAction(rotateAction) 


} 

答えて

2

おそらく、異なる座標系の違いを理解していません。シェイプノードをシーンに追加しています。したがって、シェイプの位置を設定するときは、シーンの座標系で作業する必要があります。同じロジックが他のノード(線)に適用されます。ここでは、それらをシェイプに追加します。つまり、シェイプの座標系で「考える」必要があります。

import SpriteKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 

    var shape = SKNode() 

    override func didMoveToView(view: SKView) { 

     self.addChild(shape) 
     self.physicsWorld.gravity = CGVectorMake(0.0, 0.0) 
     self.physicsWorld.contactDelegate = self 

     let greenLine = SKSpriteNode(color: .greenColor(), size: CGSize(width: 50, height: 50)) 
     greenLine.position = CGPoint(x: -30, y: 30) 

     let yellowLine = SKSpriteNode(color: .yellowColor(), size: CGSize(width: 50, height: 50)) 
     yellowLine.position = CGPoint(x: 30, y: 30) 

     let redLine = SKSpriteNode(color: .redColor(), size: CGSize(width: 50, height: 50)) 
     redLine.position = CGPoint(x: 30, y: -30) 
     let blueLine = SKSpriteNode(color: .blueColor(), size: CGSize(width: 50, height: 50)) 
     blueLine.position = CGPoint(x:-30, y:-30) 

     shape.position = CGPoint(x: frame.midX, y: frame.midY) 
     shape.addChild(greenLine) 
     shape.addChild(yellowLine) 
     shape.addChild(redLine) 
     shape.addChild(blueLine) 

     let center = SKSpriteNode(color: .redColor(), size: CGSize(width: 5, height: 5)) 

     shape.addChild(center) 

     let rotateAction = SKAction.rotateByAngle(CGFloat(2 * M_PI), duration: 5) 
     shape.runAction(rotateAction) 

    } 
} 

結果:

rotating

は中央ノードに注意してください。この例を見てください。これがシェイプノードの実際の位置です。そして、それは他のノードの回りを回っている点です。

+0

シーンの座標系について考えなかった以外は、あなたが言ったことのほとんどを理解しています。あなたが説明した方法について完全に理解していますが、私はそれを完全に理解していますが、私の問題は 'shape.position = CGPoint(x:frame.midX y:frame.midY)'という行です。私はこれを前に試してやり直しました。私はそのラインでプロジェクトを実行すると、右上に「シェイプ」を持ち、シーンの外側を回転し始めます。 – Sharukh

+0

私は 'lines'をどのように配置しているのでしょうか? – Sharukh

+0

@Sharukhええ、それはシェイプノードの子をどのように配置するかに基づいています。私が言ったように、線が形の座標系に配置されていることを忘れないでください。また、シェイプのノード位置を調べるには、センターノードで行ったように、ちょっとした点を追加するだけです。 CGPoint(0,0)に配置すると、シェイプノードが配置される場所が決まります。 – Whirlwind

関連する問題