Animieren Sie die Pfadzeichnung in SpriteKit

Ich versuche, die Zeichnung eines Strichs auf einem Pfad mithilfe von zu animierenSpriteKit. Ich habe eine funktionierende Lösung mit implementiertSKActions und eine separate Implementierung mitCABasicAnimations. DasSKAction Lösung ist nicht sehr elegant; Es erstellt und zeichnet einen neuen Pfad bei jeder Iteration einesSKAction.repeatAction(action:count:) Aufruf mit jedem neuen Pfad etwas vollständiger als der vorherige.

func start() {
    var i:Double = 1.0
    let spinAction:SKAction = SKAction.repeatAction(SKAction.sequence([
        SKAction.runBlock({
            self.drawCirclePercent(i * 0.01)

            if (++i > 100.0) {
                i = 1.0
            }
        }),
        SKAction.waitForDuration(0.01)
    ]), count: 100)
    runAction(spinAction)
}

func drawCirclePercent(percent:Double) {
    UIGraphicsBeginImageContext(self.size)

    let ctx:CGContextRef = UIGraphicsGetCurrentContext()
    CGContextSaveGState(ctx)
    CGContextSetLineWidth(ctx, lineWidth)
    CGContextSetRGBStrokeColor(ctx, 1.0, 1.0, 1.0, 1.0)
    CGContextAddArc(ctx, CGFloat(self.size.width/2.0), CGFloat(self.size.height/2.0), radius/2.0, CGFloat(M_PI * 1.5), CGFloat(M_PI * (1.5 + 2.0 * percent)), 0)
    CGContextStrokePath(ctx)

    let textureImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()
    texture = SKTexture(image: textureImage)

    UIGraphicsEndImageContext()
}

Während der obige Code funktioniert, ist er sicherlich nicht hübsch oder effizient und wahrscheinlich auch nicht wieSKActions sollten verwendet werden. DasCABasicAnimation Lösung ist viel eleganter und effizienter.

let path:CGMutablePathRef = CGPathCreateMutable()
CGPathAddArc(path, nil, 0, 0, 40.0, CGFloat(M_PI_2 * 3.0), CGFloat(M_PI_2 * 7.0), false)

let pathLayer:CAShapeLayer = CAShapeLayer()
pathLayer.frame = CGRectMake(100, 100, 80.0, 80.0)
pathLayer.path = path
pathLayer.strokeColor = SKColor.whiteColor().CGColor
pathLayer.fillColor = nil
pathLayer.lineWidth = 3.0
self.view.layer.addSublayer(pathLayer)

let pathAnimation:CABasicAnimation = CABasicAnimation(keyPath: "strokeEnd")
pathAnimation.duration = 2.0
pathAnimation.fromValue = 0.0
pathAnimation.toValue = 1.0
pathLayer.addAnimation(pathAnimation, forKey: "strokeEndAnimation")

Mein Problem ist, dass ich es wirklich vorziehen würde, wenn der gesamte Code in einer Unterklasse von enthalten wäreSKSpriteNode (so sehr, dass ich mich für die erste entscheiden würde, wenn die beiden oben genannten Lösungen die einzigen Optionen wären, die ich habe). Gibt es irgendeine Art und Weise, in der ich meine verbessern kann?SKAction Implementierung, um der CoreAnimation-Implementierung näher zu kommen, ohne dass dies erforderlich istCoreAnimation? Im Wesentlichen frage ich mich, ob SpriteKit über Funktionen verfügt, von denen ich nichts weiß, um die erste Implementierung zu verbessern.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage