2016-03-23 4 views
1

Ich habe eine SKNode, die aus 4 SKSpriteNodes besteht, die eine quadratische Form bilden (ich hoffe, ich schreibe es richtig). Jede Seite des Quadrats hat eine andere Farbe, und ich versuche, das ganze Quadrat zu drehen, ohne seine Position zu verändern. Die Art, wie ich versuche, führt immer dazu, dass sie ihre Position ändert, wenn sie mit der Rotation beginnt. Dies ist, wie ich es angesprochen:Wie man einen SKNode dreht, ohne seine Position zu ändern?

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

Ich versuchte zRotation auch, aber das hat nicht funktioniert. Wenn die Drehung mit einem SKAction geschieht, nimmt sie beim Drehen die gesamte Form nach links, anstatt an derselben Stelle zu bleiben.

bearbeiten

Code:

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) 


} 

Antwort

2

Sie wahrscheinlich den Unterschied zwischen verschiedenen Koordinatensystemen nicht verstehen. Sie fügen der Szene einen Formknoten hinzu. Wenn Sie also die Position der Form festlegen, müssen Sie im Koordinatensystem der Szene arbeiten. Die gleiche Logik gilt für die anderen Knoten (Linien). Hier fügen Sie sie der Form hinzu, was bedeutet, dass Sie im Koordinatensystem der Form "denken" müssen. Schauen Sie ein folgendes Beispiel:

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) 

    } 
} 

Das Ergebnis:

rotating

Beachten Sie den zentralen Knoten. Das ist die tatsächliche Position des Formknotens. Und genau darum herum werden andere Knoten gedreht.

+0

Ich verstehe das meiste von dem, was Sie gesagt haben, außer dass ich nicht über das Koordinatensystem der Szene nachgedacht habe. Es macht vollkommen Sinn, wie du es erklärt hast und ich verstehe es vollständig, aber mein Problem ist mit der Linie 'shape.position = CGPoint (x: frame.midX y: frame.midY)'. Ich habe das schon mal probiert und habe es wieder getan, und wenn ich mein Projekt mit dieser Linie starte, nimmt es "Form" in die obere rechte Ecke und beginnt sich außerhalb der Szene zu drehen. – Sharukh

+0

Könnte es daran liegen, wie ich die "Linien" positioniere? – Sharukh

+0

@Sharukh Ja, es basiert darauf, wie Sie die Kinder des Formknotens positionieren. Wie gesagt, vergessen Sie nicht, dass die Linien im Koordinatensystem der Form positioniert sind. Um die Knotenposition der Form herauszufinden, fügen Sie einfach einen kleinen Punkt hinzu, wie ich es mit dem mittleren Knoten getan habe. Platzieren Sie es an CGPoint (0,0) und Sie werden sehen, wo der Formknoten platziert ist. – Whirlwind