We must explicitly center the SKShapeNode before applying rotation.
import SpriteKit import PlaygroundSupport let bounds = CGRect(x: 0, y: 0, width: 400, height: 200) let skview = SKView(frame: bounds) PlaygroundPage.current.liveView = skview
In the first and second examples below, this is done by setting the x and y parameters when initializing the rectangle, and then setting the position property.
let first = SKShapeNode(rect: CGRect(x:-20, y:-20, width: 40, height: 40)) first.position = CGPoint(x: 70, y: 30) let second = SKShapeNode(rect: CGRect(x:-20, y:-20, width: 40, height: 40)) second.position = CGPoint(x: 70, y: 30) second.zRotation = CGFloat.pi * 0.15 second.strokeColor = .red
In the third example below, this is done by setting centered to true when the shape is initialized, and then setting the position property.
let path = CGMutablePath(); path.move(to: CGPoint(x: 50,y: 10)) path.addLine(to: CGPoint(x: 90, y: 10)) path.addLine(to: CGPoint(x: 90, y: 50)) path.addLine(to: CGPoint(x: 50, y: 50)) path.addLine(to: CGPoint(x: 50, y: 10)) let third = SKShapeNode(path: path, centered: true); third.position = CGPoint(x: 70,y: 30); third.zRotation = CGFloat.pi * 0.35 third.strokeColor = .yellow let scene = SKScene(size: CGSize(width: 400, height: 200)) scene.scaleMode = SKSceneScaleMode.aspectFill scene.size = skview.bounds.size scene.addChild(first); scene.addChild(second); scene.addChild(third); skview.presentScene(scene);
source share