2016-03-23 3 views
1

У меня есть SKNode, который состоит из 4 SKSpriteNodes, которые составляют квадратную форму (я надеюсь, что это правильно). Каждая сторона квадрата имеет другой цвет, и я пытаюсь повернуть всю площадь, не выбирая ее позицию. Способ, которым я пытаюсь, всегда приводит его к изменению его положения, когда он начинает вращение. Это, как я подошел к нему:Как повернуть 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)'. Я пробовал это раньше и делал это снова, и когда я запускаю свой проект с этой строкой, он занимает 'shape' в верхнем правом углу и начинает вращаться вне сцены. – Sharukh

+0

Может ли это быть из-за того, как я позиционирую 'lines'? – Sharukh

+0

@Sharukh Да, он основан на том, как вы позиционируете детей узла формы. Как я уже сказал, не забывайте, что линии расположены в системе координат фигуры. Кроме того, чтобы узнать положение узла фигуры, просто добавьте немного точки к ней, как я сделал с центральным узлом. Поместите его в CGPoint (0,0), и вы увидите, где находится узел формы. – Whirlwind

Смежные вопросы