2016-04-23 15 views
1

In SpriteKit ist die clockwise Richtung umgekehrt für UIBezierPath, aber nicht für CGPath. Zum Beispiel, wenn ichWarum definieren CGPath und UIBezierPath im SpriteKit "im Uhrzeigersinn" anders?

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

in GameScene.didMoveToView(view: SKView), der erste Knoten zieht eine 3/4 Bogen mit oben rechts fehlt, aber der zweite Knoten zieht ein Viertelbogen an oben rechts haben. Die umgekehrte "Uhrzeigerrichtung" in UIBezierPath wird erklärt in this post, aber warum verhält sich CGPath nicht gleich? Ist nicht UIBezierPath nur ein Wrapper um CGPath?

Hinweis: Dies geschieht sowohl mit Objective-C als auch Swift (also nicht sprachspezifisch). Habe die Mac App nicht mit NSBezierPath getestet.

Antwort

6

CGPath und UIBezierPath verschiedene Koordinatensysteme verwenden. UIBezierPath der Ursprung befindet sich in der oberen linken Ecke des Zeichnungsbereichs und CGPath 's Herkunft in der linken unteren Ecke. Folglich ist 90 ° der niedrigste Punkt auf dem Kreis für UIBezierPath und der höchste Punkt für CGPath. Da 0º auf dem Kreis für beide Pfade am gleichen Punkt (am weitesten rechts) liegt, werden die resultierenden Bögen im Uhrzeigersinn von 0º bis 90º unterschiedlich gezeichnet.

Mit dem Ursprung oben links befindet sich 90º (π/2) am tiefsten Punkt des Kreises, und daher wird ein UIBezierPath Bogen im Uhrzeigersinn gezeichnet, wie in der folgenden Abbildung gezeigt. Da der Ursprung von SpriteKit unten links ist, erscheint dieser Bogen umgedreht (vertikal), wenn er zum Erstellen des SKShapeNode verwendet wird.

enter image description here

mit dem Ursprung in der linken unteren Ecke, 90º ist an der Spitze des Kreises und ein im Uhrzeigersinn CGPath Bogen gezogen wird, wie unten dargestellt. Da der Ursprung von SpriteKit auch unten links ist, erscheint der Knoten des Formknotens in der gleichen Ausrichtung.

enter image description here

+0

Vielen Dank. Ich habe gerade die Referenz dazu gefunden für ['UIBezierView'] (https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/BezierPaths/BezierPaths.html#//apple_ref/doc/uid/ TP40010156-CH11-SW5) und ['CGPath'] (https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingquarz2d/dq_overview/dq_overview.html#//apple_ref/doc/uid/TP30001066 -CH202-CJBBAEEC). –