在SpriteKit中,clockwise
方向与UIBezierPath
相反,但CGPath
方向则不同。例如,如果我有
do {
let path = CGPathCreateMutable()
CGPathAddArc(path, nil, 0, 0, 10, 0, CGFloat(M_PI_2), true)
let node = SKShapeNode(path: path)
node.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
self.addChild(node)
}
do {
let path = UIBezierPath()
path.addArcWithCenter(CGPoint(x: 0, y: 0), radius: 10, startAngle: 0, endAngle: CGFloat(M_PI_2), clockwise: true)
let node = SKShapeNode(path: path.CGPath)
node.position = CGPoint(x: self.size.width/2, y: self.size.height/2 - 100)
self.addChild(node)
}
在GameScene.didMoveToView(view: SKView)
中,第一个节点绘制一个3/4弧线,右上角缺失,但第二个节点在右上角绘制四分之一弧。 UIBezierPath
中反向的“顺时针”方向被解释in this post,但为什么CGPath
的行为不同? UIBezierPath
只是CGPath
的包装器吗?
注意:Objective-C和Swift都会发生这种情况(因此不是语言特定的)。没有使用NSBezierPath
尝试使用Mac App。
答案 0 :(得分:10)
CGPath
和UIBezierPath
使用不同的坐标系。 UIBezierPath
的原点位于绘图区域的左上角,CGPath
的原点位于左下角。因此,90º是UIBezierPath
的圆圈中的最低点和CGPath
的最高点。由于两个路径的0°位于圆的同一点(最右边的点),因此从0º到90º的顺时针弧形绘制方式不同。
原点位于左上角,90º(π/ 2)位于圆的最低点,因此绘制了顺时针UIBezierPath
弧,如下图所示。由于SpriteKit的原点位于左下角,因此当用于创建SKShapeNode
时,此弧会出现翻转(垂直)。
原点位于左下角,90°位于圆的顶部,并绘制顺时针CGPath
弧,如下所示。由于SpriteKit的原点也位于左下角,因此形状节点弧以相同的方向显示。