У меня есть 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)
}
Я понимаю большую часть того, что вы сказали, за исключением того, что я не думал о системе координат сцены. Совершенно понятно, как вы объяснили, и я полностью это понимаю, но моя проблема связана с линией 'shape.position = CGPoint (x: frame.midX y: frame.midY)'. Я пробовал это раньше и делал это снова, и когда я запускаю свой проект с этой строкой, он занимает 'shape' в верхнем правом углу и начинает вращаться вне сцены. – Sharukh
Может ли это быть из-за того, как я позиционирую 'lines'? – Sharukh
@Sharukh Да, он основан на том, как вы позиционируете детей узла формы. Как я уже сказал, не забывайте, что линии расположены в системе координат фигуры. Кроме того, чтобы узнать положение узла фигуры, просто добавьте немного точки к ней, как я сделал с центральным узлом. Поместите его в CGPoint (0,0), и вы увидите, где находится узел формы. – Whirlwind